Comment obtenir de l'enfant en vue de RecyclerView?
Je suis en train d'essayer d'obtenir une pension de vue en position. J'ai pu obtenir la vue lorsqu'un élément est cliqué:
rvSellRecords.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
((MainActivity) getActivity()).showSellRecordFragment(position, view);
}
}));
Maintenant je ne peux pas avoir d'enfant, en l'absence de sur - disons, par position, par exemple:
rvSellRecords.someMagicalMethodWhichReturnsViewByPosition(5);
Question: Comment obtenir de l'enfant en vue de RecyclerView?
MODIFIER POUR BOUNTY:
J'ai RecyclerView
pour afficher les produits de la liste. Quand je clique dessus, je suis en ajoutant de nouvelles Fragment où je montre des informations sur les produits. Lors de l'ouverture, je suis la mise à jour de la barre d'outils avec vue de RecyclerView
- cela fonctionne parfaitement:
rvSellRecords.addOnItemTouchListener(new RecyclerItemClickListener(getContext(), new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
sellPresenter.onSellRecordSelected(position, view);
}
}));
When I click blue button with "+", I am incrementing quantity by 1.
public void onIncrementButtonClicked(){
sellRecord.setCount(sellRecord.getCount() + 1);
showQuantity();
bus.post(new SellRecordChangedEvent(sellRecord, sellRecordPosition));
}
Then I am posting updated sellRecord to first fragment using EventBus. There I am updating list data. I supposed that updating value(sell) automatically updates adapter. Now I am getting view from adapter using custom method(getView) which was created by me(you can find it below).
@Subscribe
public void onEvent(SellRecordChangedEvent event){
sell.getSellRecords().set(event.getSellRecordPosition(), event.getSellRecord());
sell.recalculate();
int position = event.getSellRecordPosition();
View view = adapter.getView(position);
bus.post(new TransactionTitleChangedEvent(null, view));
}
This is my adapter class - I changed adapter little bit to collect view in list and added method which returns view for respective position:
public class SellRecordsAdapter extends RecyclerView.Adapter<SellRecordsAdapter.ViewHolder> {
.....
.....
.....
List<View> viewList;
public SellRecordsAdapter(List<SellRecord> sellRecordList) {
.....
viewList = new ArrayList<>();
}
.....
.....
.....
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
.....
.....
.....
viewList.add(i, viewHolder.itemView);
}
public View getView(int position){
return viewList.get(position);
}
}
Mon problème: quand j'ai la mise à jour de la vue dans la barre d'outils, je suis ancien point de vue. Lorsque la quantité est de 3, je me suis vue avec les 2. Lorsque la quantité 10 - view est avec 9.
Ma question: comment s'en vue de recycler de vue à l'aide de la position de l'élément(sans clic de l'auditeur)?
- pourquoi vous minusing moi?
- U voulez obtenir la vue enfant sans cliquer ??
- oui, je souhaite obtenir l'afficher sans cliquer à l'aide de la position
- Ainsi, le recyclerview et de votre produit d'information sont dans 2 différents fragments oui? Vous attendez les recyclerview position de mise à jour quand ils ne sont même pas au premier plan? aussi, vous sont en train de changer adaptateur élément de données les données à la position
event.getSellRecordPosition()
, mais vous ne notifiant pas la carte son dataset changé, soit paradapter.notifyDataSetChanged()
ou l'autrenotifyItemChanged(position)
méthodes - Possible de répéter cette question: stackoverflow.com/questions/33784369/...
Vous devez vous connecter pour publier un commentaire.
Utilisation
recyclerView.findViewHolderForLayoutPosition(position)
oureyclerView.findViewHolderForAdapterPosition(position)
pour obtenir le viewholder de position. Ensuite, vous pouvez accéder à tout enfant à partir de votre viewholder.Caisse Recyclerview
Vous pouvez utiliser RecyclerView de LayoutManager pour elle.
findViewByPosition(0)
, il retournera null.C'est un supplément à @Ravi Teja réponse. Vous pouvez obtenir le viewHolder de la recyclerView à l'aide de la position de l'élément en particulier, puis obtenir un point de vue particulier de la viewHolder comme indiqué ci-dessus
Je poste une réponse parce que ce qui est vraiment complexe à findviews() à partir de RecyclerView.
@Joe: Après avoir passé 4 heures trouvé une réponse. Ce qui me donne le bon affichage de l'index.
Désormais à accéder à votre point de vue par:
v.findViewById(R.id.edittext)
OU toute pièce d'identité.Espère que cela aide quelqu'un:
J'ai été faire de pointeur null exceptions:
La raison en est qu'il y a un léger retard pour la viewholder d'être créé.
J'ai trouvé la solution ici: https://stackoverflow.com/a/33414430/7952427
Écrire cette méthode dans l'adaptateur.
et vous avez juste besoin de l'appeler comme
passer votre position requise.
L'espoir de résoudre votre problème.
viens de mettre cette méthode dans votre code et vous pouvez l'appeler comme vous aime
maintenant, je comprends votre problème. vous devez utiliser l'interface pour rejoindre recyclerview élément et de l'activité.
vous devez définir une classe d'interface comme ci-dessous:
ajouter ce paramètre à votre classe d'adaptateur:
et l'initialiser dans le constructeur avec la valeur que l'obtenir à partir d'entrées.
lorsque l'utilisateur cliquera sur le bouton PLUS, vous pouvez envoyer l'événement à l'activité par cette ligne:
dans votre classe d'activité, vous devez implémente IViewClick interface et ajouter votre code, comme ceci:
ce n'est pas la bonne solution pour vous.
RecyclerView.ViewHolder titulaire =
mRecyclerView.findViewHolderForItemId(mAdapter.getItemId(i));
Je ne recommanderais pas le suivi de l'affichage de la liste vous-même. Cela pourrait conduire à des problèmes bizarres avec les mises à jour, les mises à jour de position, etc.
Plutôt sur votre SellRecordChangedEvent, utilisez findViewHolderForAdapterPosition() à la place de l'adaptateur.getView().
http://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#findViewHolderForAdapterPosition(int)
Et comme une note de côté, il est préférable de mettre en œuvre un réel élément, cliquez sur l'auditeur à la itemView sur le ViewHolder au lieu de l'aide de toucher l'auditeur. Il y a beaucoup d'exemples de cette ligne.
De sorte que le recyclerview et de votre produit d'information sont dans 2 différents fragments oui? Vous attendez les recyclerview position de mise à jour quand ils ne sont même pas au premier plan? aussi, vous sont en train de changer adaptateur élément de données les données à la position
event.getSellRecordPosition()
, mais vous ne notifiant pas la carte son dataset changé, soit paradapter.notifyDataSetChanged()
ou l'autrenotifyItemChanged(position)
méthodes.J'avais modifier votre onEvent() comme ceci:
Appelant createViewHolder et suivant BindViewHolder sur votre carte va certainement mettre à jour les points de vue pour ce poste, votre adaptateur.getView(position) doit retourner la dernière vue.
Ici MyViewHolder est votre viewholder classe et yourRecyclerview, est la référence pour votre recycleur vue