Ich bin nicht sehr stolz auf diese Lösung aufgrund der Schleife, aber dies ist eine Alternative für kurze Listen:
Sie können die geklickt Ansicht von einem Zuhörer erhalten, die viewHolder aus der Sicht und dem Adapter Position aus der Sicht Halter verwenden schließlich diese Methoden:
Use this method
/**
* Returns the adapter position of the Child associated with this ChildViewHolder
*
* @return The adapter position of the Child if it still exists in the adapter.
* RecyclerView.NO_POSITION if item has been removed from the adapter,
* RecyclerView.Adapter.notifyDataSetChanged() has been called after the last
* layout pass or the ViewHolder has already been recycled.
*/
@UiThread
public int getChildAdapterPosition() {
int flatPosition = getAdapterPosition();
if (mExpandableAdapter == null || flatPosition == RecyclerView.NO_POSITION) {
return RecyclerView.NO_POSITION;
}
return mExpandableAdapter.getChildPosition(flatPosition);
}
Also see
/**
* Given the index relative to the entire RecyclerView for a child item,
* returns the child position within the child list of the parent.
*/
@UiThread
int getChildPosition(int flatPosition) {
if (flatPosition == 0) {
return 0;
}
int childCount = 0;
for (int i = 0; i < flatPosition; i++) {
ExpandableWrapper<P, C> listItem = mFlatItemList.get(i);
if (listItem.isParent()) {
childCount = 0;
} else {
childCount++;
}
}
return childCount;
}
Eine einfache Möglichkeit, den Listener zu definieren here.
ItemClickSupport.addTo(mRecyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
@Override
public void onItemClicked(RecyclerView recyclerView, int position, View v) {
// do it
}
});
Verwenden this, um die viewHolder zu erhalten:
@Override
public void onClick(View v) {
MyHolder holder = (MyHolder) mRecyclerView.getChildViewHolder(v);
holder.textView.setText("Clicked!");
}
Überprüfen Sie die view type-know when die geklickt Ansicht ein Elternteil oder ein Kind
//Returns the view type of the item at position for the purposes of view recycling.
@Override
public int getItemViewType(int position) {
if (items.get(position) instanceof User) {
return USER;
} else if (items.get(position) instanceof String) {
return IMAGE;
}
return -1;
}
ein „Klick-Listener“ Verwenden Sie erhalten die Ansicht und der Viewholder und die Adapterposition mit Bibliotheksmethoden. Wenn es keine sehr lange Liste ist, können Sie von der ersten Position zur angeklickten Position iterieren (parent? Count = 0: count ++), count ist Ihre untergeordnete Position nach der Schleife. Wenn Sie ihren Code überprüfen, finden Sie einen Ort, wo sie das gleiche tun. – albodelu