2016-10-06 4 views
0

Edit: Wenn jemand das gleiche Problem in der Zukunft hat, war es eine ziemlich einfache Lösung. Ich habe ClearView (RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) verwendet, um zu verarbeiten, wenn das gesamte Ziehen beendet wurde und vergessen hatte, es als Super-Methode zu bezeichnen. Deshalb wurde es nicht richtig aktualisiert.Hinzugefügtes Element wird nicht in RecyclerView nach dem Löschen eines anderen mit Swipe

Original Frage:

Hier ist der gesamte Code: https://github.com/vustav/Ppaaiinntt/tree/master/app/src/main/java/com/decent/rvtest

Alles funktioniert gut, außer wenn ich ein Element direkt nach dem Löschen eines weiteren hinzuzufügen. Es existiert jedoch. Wenn ich ein anderes hinzufüge, gibt es einen richtig bemessenen Abstand zwischen der alten Liste und dem neuen Element. Ich benutze eine Zeichenkette, wo sie ihre Namen vor einem Druck hinzufügen und es dort zeigt, und wenn ich ziehe, um Positionen der Elemente zu ändern, wird es richtig angezeigt.

Mein Ruf erlaubt mir nicht, Bilder zu veröffentlichen, damit ein Imgur-Album zu tun hat: http://imgur.com/a/bmb17

  • Auf dem ersten Bild gibt es drei Elemente und die Schnur am Boden gedruckt.

  • Das zweite Bild ist nach dem Swipe. Beachten Sie, dass die Zeichenfolge aktualisiert wird.

  • Die dritte ist nach dem Hinzufügen einer anderen "111". Die Zeichenfolge ist korrekt, wird jedoch nicht in der Ansicht angezeigt.

  • Der vierte ist nach dem Hinzufügen eines anderen. Die Zeichenfolge ist immer noch korrekt und das neue Element wird in der Ansicht angezeigt.

  • Das letzte Bild wird nach dem Ziehen verschoben, um die Position der letzten beiden Elemente zu ändern. Jetzt ist wieder alles in Ordnung.

Dies sind die relevanten Methoden (glaube ich):

protected void add(PictureElement pe){ 
    chain.add(pe); 
    notifyItemInserted(chain.size()-1); 
} 

public void remove(int position) { 
    chain.remove(position); 
    notifyItemRemoved(position); 
} 

protected void swap(int from, int to){ 
    chain.swap(from, to); 
    notifyItemMoved(from, to); 
} 

Edit: onBindViewHolder, getItemCount und die ViewHolder:

@Override 
public int getItemCount() { 
    return chain.size(); 
} 

@Override 
public void onBindViewHolder(PEViewHolder PEViewHolder, int i) { 
    PictureElement pe = chain.get(i); 
    PEViewHolder.name.setText(pe.getName()); 
} 

protected static class PEViewHolder extends RecyclerView.ViewHolder { 
    protected TextView name; 

    public PEViewHolder(View v) { 
     super(v); 
     name = (TextView) v.findViewById(R.id.txtName); 
    } 
} 
+0

posten Sie Ihre Adapter-Code, spezifisch binden Methode und getCount – marmor

Antwort

0

Interessante Zitat auf der verschiedenen Methoden informieren Sie verwenden

public final void notifyItemRemoved (int position) Benachrichtigen Sie alle registrierten Beobachter, dass der zuvor an der Position befindliche Artikel aus dem Datensatz entfernt wurde. Die Positionen, die sich zuvor bei und nach der Position befanden, können nun bei oldPosition - 1 gefunden werden. Dies ist ein Strukturänderungsereignis. Darstellungen anderer vorhandener Artikel in der Datensatz werden immer noch als aktuell angesehen und werden nicht zurückgestuft, obwohl ihre Positionen geändert werden können. Parameter position: Position des Elements, das jetzt entfernt wurde.

public final Leere notifyItemRangeChanged (int positionStart, int ItemCount) alle registrierten Beobachter Eine Nachricht, dass die ItemCount Artikel an Position positionStart geändert haben zu starten. Entspricht dem Aufruf notifyItemRangeChanged (position, itemCount, null) ;.Dies ist ein Element Ereignis ändern, kein Strukturänderungsereignis. Es zeigt an, dass jede Reflexion der Daten in dem gegebenen Positionsbereich veraltet ist und aktualisiert werden sollte. Die Artikel in dem angegebenen Bereich behalten die gleiche Identität bei.

Könnten Sie diesen Codeblock versuchen und kommentieren und prüfen, ob es

//Called by the ItemTouchHelper when the user interaction with an element is over and it also 
    // completed its animation 
    /* 
@Override 
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 

     //update from where the action took place 
     mPEAdapter.updateChain(viewHolder.getLayoutPosition()); 

     //clearView is called after onMove so any drags or swipes are complete 
     dragging = false; 
     mPEAdapter.setSwipe(false); 
    } 
*/ 
+0

Dank funktioniert, aber es nicht – GrandDuc

+0

@GrandDuc zu schlecht funktionierten. Ohne Ihren vollständigen Code ist es unmöglich, ein Debugging durchzuführen. Verwenden Sie zufällig einen benutzerdefinierten LayoutManager? – HenriqueMS

+0

Danke für den Versuch zu helfen! In der ursprünglichen Frage wurde ein Link zum Code hinzugefügt. – GrandDuc

Verwandte Themen