0

私は、RecyclerViewを使用して表示されるアダプタに曲データを読み込むためにローダーを使用している音楽プレーヤーアプリケーションを作成しています。しかし、私のアダプタメソッドのこの奇妙なエラーが動作していないです。アダプタのコンストラクタメソッドのみが呼び出されます。 スタックオーバーフローで使用可能なすべてのソリューションを実行しているにもかかわらず、「アダプタが接続されず、レイアウトをスキップしています」というメッセージが表示されます。RecyclerViewアダプターが接続されていません。レイアウトをスキップする、データが表示されない

いくつかの点に注意する:私はすべてのソリューションを試してみた

  • ; recyclerview No adapter attached; skipping layoutスレッドと関連付けられているすべての重複スレッドに「添付なしアダプタレイアウトをスキップ」。私が使用している
  • RecyclerViewは、通常の1が、FastScrollRecyclerViewではありませんが、それは通常のRecyclerViewから延び、githubの上で言及した全く関係づけ問題がないので、このライブラリを使用すると、ここで
  • 問題ではないことを私は確信しています
  • 私はまた、thisスレッドから呼び出されていないアダプタメソッドのすべてのソリューションを試しましたが、運はありません。

ここでは、コードは次のとおり

SongsFragment.java

public class SongsFragment extends Fragment 
    implements LoaderManager.LoaderCallbacks<List<Song>>{ 

public static final String LOG_TAG = SongsFragment.class.getSimpleName(); 
private static final int LOADER_ID = 1; 
private ContentResolver mContentResolver; 
private SongListAdapter mSongListAdapter; 
private List<Song> mSongs; 
@BindView(R.id.rvSongs) FastScrollRecyclerView mRecyclerView; 

public SongsFragment() {} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ButterKnife.bind(getActivity()); 
    mSongs = new ArrayList<>(); 
    mRecyclerView = new FastScrollRecyclerView(getContext()); 
    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); 
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    mRecyclerView.setLayoutManager(layoutManager); 
    mRecyclerView.setHasFixedSize(true); 
    mSongListAdapter = new SongListAdapter(getContext(), mSongs); 
    mRecyclerView.setAdapter(mSongListAdapter); 

} 

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    getLoaderManager().initLoader(LOADER_ID, null, this).forceLoad(); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_songs, container, false); 
} 

@Override 
public Loader<List<Song>> onCreateLoader(int id, Bundle args) { 
    mContentResolver = getActivity().getContentResolver(); 
    return new SongsLoader(getContext(), mContentResolver); 
} 

@Override 
public void onLoadFinished(Loader<List<Song>> loader, List<Song> data) { 
    mSongs = data; 
    mSongListAdapter.setData(mSongs); 
} 

@Override 
public void onLoaderReset(Loader<List<Song>> loader) { 
    mSongListAdapter.setData(new ArrayList<Song>()); 
} 

}

SongsListAdapter.java

public class SongListAdapter 
    extends FastScrollRecyclerView.Adapter<SongListAdapter.SongItemViewHolder> 
    implements FastScrollRecyclerView.SectionedAdapter{ 

public static final String LOG_TAG = SongListAdapter.class.getSimpleName(); 
private Context mContext; 
private List<Song> mSongList = new ArrayList<>(); 

public SongListAdapter(Context context, List<Song> songList) { 
    Log.d(LOG_TAG, "Constructor called"); 
    mContext = context; 
    mSongList = songList; 
} 

@NonNull 
@Override 
public String getSectionName(int position) { 
    return String.valueOf(mSongList.get(position).getTitle().charAt(0)).toUpperCase(); 
} 

@Override 
public SongItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    Log.d(LOG_TAG, "onCreateViewHolder called"); 
    View view = LayoutInflater.from(mContext).inflate(R.layout.list_item_song, null); 
    return new SongItemViewHolder(view); 
} 

@Override 
public void onBindViewHolder(SongItemViewHolder holder, int position) { 
    Log.d(LOG_TAG, "onBindViewHolder called"); 
    Uri albumArtUri = mSongList.get(position).getAlbumArtUri(); 
    Glide.with(mContext) 
      .load(albumArtUri) 
      .into(holder.albumArt); 
    holder.titleText.setText(mSongList.get(position).getTitle()); 
    holder.artistText.setText(mSongList.get(position).getArtistName()); 
    Log.d("Data", albumArtUri.toString() + "\n" + mSongList.get(position).getTitle() + "\n" + mSongList.get(position).getArtistName()); 
} 

@Override 
public int getItemCount() { 
    Log.d(LOG_TAG, "getItemCount called"); 
    return (mSongList != null ? mSongList.size() : 0); 
} 

public void setData(List<Song> songs){ 
    mSongList = songs; 
    notifyDataSetChanged(); 
} 

public class SongItemViewHolder extends FastScrollRecyclerView.ViewHolder { 
    ImageView albumArt; 
    TextView titleText; 
    TextView artistText; 

    SongItemViewHolder(View view) { 
     super(view); 
     Log.d(LOG_TAG, "SongItemViewHolder called"); 
     albumArt = (ImageView) view.findViewById(R.id.item_song_image); 
     titleText = (TextView) view.findViewById(R.id.item_song_title); 
     artistText = (TextView) view.findViewById(R.id.item_song_artist_name); 
    } 
} 

は}

fragment_songs.xml(SongsFragmentは、このレイアウトを膨らませている)

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:app="http://schemas.android.com/apk/res-auto" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 


    <com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView 
     android:id="@+id/rvSongs" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:fastScrollPopupBgColor="@color/colorAccent" 
     app:fastScrollPopupTextColor="@android:color/primary_text_dark" 
     app:fastScrollThumbColor="@color/colorAccent"/> 

</ScrollView> 

list_item_song.xml(リサイクル・ビューの個別項目)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical"> 

<View 
    android:layout_width="match_parent" 
    android:layout_height="1dp" 
    android:layout_gravity="center_horizontal" 
    android:layout_marginStart="12dp" 
    android:layout_marginLeft="12dp" 
    android:layout_marginRight="12dp" 
    android:background="#FFFFFF"/> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:paddingBottom="10dp" 
    android:paddingLeft="8dp" 
    android:paddingRight="8dp" 
    android:paddingStart="8dp" 
    android:paddingTop="10dp"> 

    <FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <ImageView 
      android:id="@+id/item_song_image" 
      android:layout_width="64dp" 
      android:src="@drawable/music_placeholder" 
      android:layout_height="64dp"/> 

    </FrameLayout> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="16dp" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/item_song_title" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="16sp" 
      android:text="Song_Title"/> 

     <TextView 
      android:id="@+id/item_song_artist_name" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="3dp" 
      android:textSize="12sp" 
      android:text="Song_Artist"/> 

    </LinearLayout> 

</LinearLayout> 

</LinearLayout> 

これは本当にイライラされています。コードを確認して、これを手伝ってください。私はすべてを正しく行ったと思うが、間違っているかもしれない。私はscrollviewを知っているとrecyclerviewはうまく行かないが、私はプレビューとリサイクラビューを見てきました。どんな助けもありがとう。ありがとう!

+0

あなた 'SongListAdapterに供給されているリストのサイズをログに記録します.setData() ' –

+0

'SongListAdapter.setData()'に渡されるリストのサイズを知るためにlogステートメントを使いました。サイズは609です。私のデバイスのためにその曲に609曲が渡されます。 – Pulak

+0

'Log.d(LOG_TAG、" getItemCount ");'を取得しましたか? –

答えて

0

getActivity()を使用onLoadFinished()にアダプタを設定してみてくださいとも

mRecyclerView = new FastScrollRecyclerView(getActivity()); 

にアダプタオブジェクトにコンテキストのために、この mRecyclerView = new FastScrollRecyclerView(getContext());でも

@Override 
public void onLoadFinished(Loader<List<Song>> loader, List<Song> data) { 
    mSongs = data; 
    mSongListAdapter = new SongListAdapter(getActivity(), mSongs); 
    mRecyclerView.setAdapter(mSongListAdapter); 
} 

getActivity()を使用うん!私はこれで多くの時間を無駄にしましたが、最終的に解決策が出ました。行と後

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 
View rootView = inflater.inflate(R.layout.fragment_songs, container, false); 
mRecyclerView = (FastScrollRecyclerView) rootView.findViewById(R.id.rvSongs); 
//Rest of the things 
} 

インスタンスmRecyclerViewがNULLであったので、私はButterKnifeに間違った方法を使用していたが判明しかし:私はButterknife結合を除去し、これにonCreateView()を変更することにより、ビュー・インスタンスを捕捉した後、SongsFragmentonCreateView()内部従来findViewById使用しました mRecyclerView = new FastScrollRecyclerView(getContext());これはもうnullではありませんでしたが、まだビューに接続されていないため、NullPointerExceptionを取得せず、コードが機能しませんでした。

私はそれがnoobのが間違いだった知っている

:D

公式サイトから拾って断片とButterKnifeを使用するための正しい方法は次のとおりです。

public class FancyFragment extends Fragment { 
    @BindView(R.id.button1) Button button1; 
    @BindView(R.id.button2) Button button2; 

    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fancy_fragment, container, false); 
    ButterKnife.bind(this, view); 
    // TODO Use fields... 
    return view; 
    } 
} 
1

基本的フラグメントのクラスにコンテキストに

+0

私の答えを更新してみてくださいと私に知らせてください –

+0

すでにonLoadFinished()でアダプタを設定しようとしましたが、うまくいきませんでした。 getActivity()を使用してみましたがうまくいきませんでした:( – Pulak

+0

私はこれを長年にわたって頑張っています。 – Pulak

関連する問題