Questo è il mio primo tentativo di associazione dati con un RecyclerView ma non il mio primo utilizzo di RecyclerView.RecyclerView e Data Binding non funzionanti
Per qualche motivo, nessuno dei metodi dell'adattatore viene chiamato - nemmeno getItemCount(). Potrebbe essere uno stupido problema con il mio RecyclerView e niente a che fare con l'associazione dati, ma non riesco a vedere nulla di sbagliato.
View rootview = inflater.inflate(R.layout.fragment_profile_first, container, false);
// Initialize recycler view
RecyclerView badgesRV = (RecyclerView) rootview.findViewById(R.id.badgesRV);
LinearLayoutManager llm = new LinearLayoutManager(getActivity());
llm.setOrientation(LinearLayoutManager.HORIZONTAL);
badgesRV.setLayoutManager(llm);
BadgeAdapter badgeAdapter = new BadgeAdapter(profileObject.badgesEntity.badges);
badgesRV.setAdapter(badgeAdapter);
Adapter:
public class BadgeAdapter extends RecyclerView.Adapter<BadgeAdapter.BadgeBindingHolder>{
private static final int MAX_BADGES_TO_DISPLAY = 5;
private BadgeObject[] badges;
public BadgeAdapter(BadgeObject[] badges){
this.badges = badges;
}
@Override
public BadgeBindingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.profile_badge_row, parent, false);
BadgeBindingHolder holder = new BadgeBindingHolder(v);
return holder;
}
@Override
public void onBindViewHolder(BadgeBindingHolder holder, int position) {
final BadgeObject badgeObject = badges[position];
holder.getBinding().setVariable(BR.badge, badgeObject);
holder.getBinding().executePendingBindings();
}
@Override
public int getItemCount() {
Log.d(TAG, "item count = " + Math.min(MAX_BADGES_TO_DISPLAY, badges.length));
return Math.min(MAX_BADGES_TO_DISPLAY, badges.length);
}
public class BadgeBindingHolder extends RecyclerView.ViewHolder{
private ViewDataBinding binding;
public BadgeBindingHolder(View rowView) {
super(rowView);
binding = DataBindingUtil.bind(rowView);
}
public ViewDataBinding getBinding() {
return binding;
}
}
}
profile_badge_row.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable name="badge" type="parseJsonEntities.requestObjects.BadgeObject"/>
</data>
<LinearLayout
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@{badge.badgeImage}"/>
</LinearLayout>
Ho controllato e non è sicuramente dei dati lì. Cosa mi sono perso?
=====================
Aggiornamento:
Da quello che posso dire RecyclerView semplicemente non funziona all'interno di un Data Binding disposizione. Ho creato un layout separato con solo il mio camper e ha funzionato perfettamente. Non appena l'ho incluso nel mio layout principale, ha smesso di funzionare.
Non sono sicuro se si tratta di un bug o di una funzionalità.
Quindi, ho pensato che forse, se avessi fatto una visualizzazione personalizzata, forse funzionerà e lo farà. Il mio problema è che non so come passare un valore nella mia vista personalizzata.
Ho cercato here ma non riuscivo a capire esattamente cosa intendesse. Questo è il mio codice nella visualizzazione personalizzata.
LayoutInflater inflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.profile_badges_layout, this, true);
ProfileBadgesLayoutBinding binding = ProfileBadgesLayoutBinding.inflate(inflater);
RecyclerView badgesRV = (RecyclerView) view.findViewById(R.id.badgesRV);
LinearLayoutManager llm = new LinearLayoutManager(context);
llm.setOrientation(LinearLayoutManager.HORIZONTAL);
badgesRV.setLayoutManager(llm);
BadgeAdapter badgeAdapter = new BadgeAdapter(null);
badgesRV.setAdapter(badgeAdapter);
Questo dà un messaggio che ProfileBadgesLayoutBinding non è stato trovato.
dov'è il tuo xml frammento ?? –
'RecyclerView' funziona perfettamente con' DataBinding', poiché molti altri lo stanno usando senza problemi. Puoi pubblicare il tuo layout dove si trova il tuo 'RecyclerView'? Forse qualche strano comportamento con altre viste a scorrimento. – yennsarah
Inoltre, che cos'è 'badge.badgeImage'? Un 'ID risorsa', un 'Disegnabile' ..? – yennsarah