Android recyclerView findViewHolderForAdapterPosition retourne null
Je veux cliquer sur un élément dans recyclerView de la programmation, j'ai trouvé d'une manière faire:
recyclerView.findViewHolderForAdapterPosition(0).itemView.performClick();
mais il ne fonctionne pas pour moi, le findViewHolderForAdapterPosition retourne null.
Ai-je raté quelque chose dans mon code?
HistoryListAdapter:
public class HistoryListAdapter extends RecyclerView.Adapter<HistoryListAdapter.ViewHolder> {
private static ArrayList<RecordItem> recordItems;
private static FragmentActivity activity;
private static RecordList recordList;
public HistoryListAdapter(ArrayList<RecordItem> recordItems, FragmentActivity FA, RecordList FRL) {
this.recordItems = recordItems;
this.activity = FA;
this.recordList = FRL;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//create a new view
View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recorditem, parent, false);
return new ViewHolder(itemLayoutView);
}
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
//TextView setText ...
}
//Return the size of the itemsData (invoked by the layout manager)
@Override
public int getItemCount() {
return recordItems.size();
}
//inner class to hold a reference to each item of RecyclerView
public static class ViewHolder extends RecyclerView.ViewHolder{
public TextView result, datetime;
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
itemLayoutView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (activity != null) {
//do something...
}
}
});
result = (TextView) itemLayoutView.findViewById(R.id.result);
heartrate = (TextView) itemLayoutView.findViewById(R.id.heartrate);
datetime = (TextView) itemLayoutView.findViewById(R.id.datetime);
}
}
}
RecordList:
RecyclerView listView = (RecyclerView) layoutView.findViewById(R.id.listView);
HistoryListAdapter listadapter = new HistoryListAdapter(itemsToShow, getActivity(), RecordList.this);
listView.swapAdapter(listadapter, false);
listView.findViewHolderForAdapterPosition(0).itemView.performClick();
J'ai omis un peu de code, Mais il ne devrait pas affecter l'ensemble de la structure de mon code.
- Cochez cette réponse d'obtenir une belle façon de mettre en œuvre une fonction onclick dans recyclerview : stackoverflow.com/questions/31174712/...
Vous devez vous connecter pour publier un commentaire.
Selon la la documentation officielle:
Il n'est pas sûr d'utiliser
findViewHolderForAdapterPosition()
.Lorsque vous appelez cette méthode après
listView.swapAdapter(listadapter, false);
vous aurez toujours unenull
comme résultat, parce quenotifyDataSetChanged()
sera appelée.notifyDataSetChanged()
, mais je l'appellelayoutManager.scrollToPosition(number)
avantfindViewHolderForAdapterPosition()
vous pouvez faire ceci:
postDelayed
là (et ce n'est pas seulement à propos de cette question, j'ai vu beaucoup de similitudes dans les réponses et commentaires à d'autres questions). C'est stupide...vous pouvez faire ceci:
Hey j'ai résolu le problème de cette façon:
Je wouldnt vous recommandons d'utiliser délai d'envoi. Bien qu'il travaille le timing est arbitraire.
À l'aide de OnPreDrawListener sur le recyclerview, le calendrier sera aligné avec le prochain tirage du cycle et les éléments visibles sont accessibles.