0

Je crée une application de lecteur de musique où j'utilise un chargeur pour charger des données de morceau dans l'adaptateur qui doit être affiché à l'aide d'un RecyclerView. Cependant, je reçois cette erreur bizarre de mes méthodes d'adaptateur ne fonctionne pas. Seule la méthode constructeur de l'adaptateur est appelée. Je reçois également "Aucun adaptateur connecté, la disposition de saut" malgré passer par toutes les solutions disponibles ici en débordement de pile.RecyclerView Aucun adaptateur fixé; Saut de mise en page, Données non affichées

Quelques points à noter:

  • J'ai essayé toutes les solutions pour « Aucun adaptateur ci-joint, sauter la mise en page » dans fil recyclerview No adapter attached; skipping layout et toutes les discussions en double associés. Le RecyclerView que j'utilise n'est pas le régulier, mais FastScrollRecyclerView, mais comme il ne fait pas partie de RecyclerView et qu'il n'y a pas de problèmes relatables mentionnés sur github, je suis convaincu que l'utilisation de cette librairie n'est pas un problème
  • J'ai également essayé toutes les solutions pour que les méthodes d'adaptateur ne soient pas appelées du fil this mais pas de chance.

Voici le code:

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 est gonflait cette mise en page)

<?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 (article individuel en recycleur)

<?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> 

Cela a été vraiment frustrant. S'il vous plaît examiner le code et m'aider avec cela. Je pense que j'ai tout fait correctement mais j'ai peut-être tort. Je sais que scrollview et recyclerview ne vont pas très bien, mais j'ai vu la prévisualisation et la vue des recycleurs. Toute aide serait appréciée. Merci!

+0

Consigner la taille de la liste fournie à votre 'SongListAdapter .setData() '. –

+0

Utilisé une instruction log pour connaître la taille de la liste transmise à 'SongListAdapter.setData()'. La taille est 609. 609 chansons sont transmises à cette chanson pour mon appareil. – Pulak

+0

Avez-vous 'Log.d (LOG_TAG," getItemCount appelé ");'? –

Répondre

0

Pouah! J'ai perdu beaucoup de temps dans ceci mais est finalement sorti avec la solution.J'ai enlevé Butterknife liant et utilisé findViewById classique à l'intérieur onCreateView() de SongsFragment après la capture de l'instance de vue en changeant la onCreateView() à ceci:

@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 
} 

se trouve que j'utilisais Butterknife la mauvaise façon si l'instance mRecyclerView était nulle, mais plus tard avec la ligne mRecyclerView = new FastScrollRecyclerView(getContext()); il n'était plus nul mais il n'était toujours pas connecté à la vue, donc je n'ai pas obtenu NullPointerException et le code n'a pas fonctionné.

Je sais que c'était une erreur noob: D

façon correcte d'utiliser Butterknife avec des fragments comme ramassait du site officiel est:

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

adaptateur de réglage Essayez de vous onLoadFinished() et également utiliser getActivity() pour le contexte dans l'objet de l'adaptateur

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

également dans ce mRecyclerView = new FastScrollRecyclerView(getContext()); à

mRecyclerView = new FastScrollRecyclerView(getActivity()); 

utiliser Fondamentalement getActivity() pour le contexte en classe fragment

+0

mis à jour ma réponse et l'essayer et faites-le moi savoir –

+0

Avoir déjà essayé de placer l'adaptateur dans onLoadFinished() mais cela n'a pas fonctionné. Essayé d'utiliser getActivity() mais n'a pas fonctionné :( – Pulak

+0

Merci @quicklearner pour jeter un oeil! Je suis coincé sur cela depuis longtemps maintenant.J'espère que j'obtiendrai la solution bientôt. – Pulak