1

Ich verwende eine erweiterbare Recyclerview in meinem Projekt, die Daten werden von einer firebase consulting zur Verfügung gestellt.erweiterbare recyclerview update von firebase

Die erweiterbare recyclerView, die ich benutze ist: bignerdranch

Was ist der beste Weg, um meine Ansicht zu aktualisieren, da die Website sagt:

Bitte beachten Sie, dass die traditionellen notifyDataSetChanged() von RecyclerView.Adapter nicht als

soll arbeiten und empfehlen Verwendung:

// Kinder Änderungen

notifyChildInserted(int parentPosition, int childPosition)

...

Aber ich weiß nicht, die childPositions dass geändert.

+0

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

Antwort

0

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; 
    } 
Verwandte Themen