RecyclerView Adapter notifyDataSetChanged stoppt Phantasie Animation

Ich baue eine Komponente auf der Grundlage von RecyclerView, so dass Benutzer Elemente per Drag & Drop neu anordnen können. Sobald ich auf der DragListener Seite bin, brauche ich die Position, die es im Adapter hat, um korrekte Bewegung durchzuführen, aber ich habe nur Zugriff auf die Ansicht. Also hier ist was ich in der Adapteransicht binden bin:

@Override public void onBindViewHolder(ViewHolder viewHolder, int position) { Track track = mArray.get(position); viewHolder.itemView.setTag(R.string.TAG_ITEM_POSITION, position); } 

Ist es Ihnen richtig? Denn wenn ich einen Artikel wie folgt verschiebe:

  • Aufblasendes Layout auf ListItem basierend auf ListItem spezifische Variable
  • Löschen Listenansicht Inhalt?
  • Können wir startActivityForResult vom Adapter anrufen?
  • GridView inside Erweiterbare Liste in Android
  • Ist es möglich, sich auf ListView von Adapter in Android zu beziehen?
  • Durchführen von Rundschreiben im PagerAdapter
  •  public void move(int from, int to){ Track track = mArray.remove(from); mArray.add(to, track); notifyItemMoved(from, to); } 

    Dann Position Tag ist nicht mehr korrekt, und wenn ich notifyDataSetChanged (), verliere ich die Phantasie Animation. Irgendein Vorschlag ?

  • Wie kann ich Audio kontinuierlich spielen, während sich die Orientierung in Android ändert?
  • Wie kann ich einen Ripple-Effekt auf Textansicht oder Imageview auf Android setzen?
  • Android drehe Bildansicht, ich kann nicht die endgültige Position der Bildansicht in onAnimationEnd ()
  • Aktiviere DEBUG Logging auf Blu R1 HD (Amazon Phone)
  • Android SQLite-Datenbank wird beschädigt
  • Android Lint contentDescription Warnung
  • 3 Solutions collect form web for “RecyclerView Adapter notifyDataSetChanged stoppt Phantasie Animation”

    Nein, es ist falsch Zuerst können Sie nicht auf die Position verweisen, die an den onBindViewHolder übergeben wird, nachdem diese Methode zurückgegeben wird. RecyclerView wird eine Ansicht nicht zurücksetzen, wenn sich seine Position ändert (aufgrund von Gegenständen usw.).

    Stattdessen kannst du ViewHolder#getPosition() die dir die aktualisierte Position ViewHolder#getPosition() .

    Wenn Sie das beheben, sollte Ihr Umzugscode funktionieren und schöne Animationen geben.

    Aufruf von notifyDataSetChanged verhindert vorhersagende Animationen so vermeiden, solange du kannst. Einzelheiten siehe Dokumentation .

    Bearbeiten (von Kommentar): um Position von außen zu bekommen, bekomme Kinderansicht Inhaber von recyclerview und dann Position von der vh bekommen. Siehe RecyclerView api für Details

    Es gibt einen Weg, um Phantasie Animationen mit nur notifyDataSetChanged()

    1. Du musst deinen eigenen GridLayoutManager mit overriden GridLayoutManager supportsPredictiveItemAnimations() Methode machen, die true GridLayoutManager ;

    2. Sie müssen mAdapter.setHasStableIds(true)

    3. Der Teil, den ich tricky finde, musst du die Methode des getItemId() Adapters getItemId() . Es sollte Wert zurückgeben, der wirklich einzigartig ist und nicht eine direkte Funktion der position . Etwas wie mItems.get(position).hashCode()

    In meinem Fall perfekt gearbeitet – schöne Animationen zum Hinzufügen, Entfernen und Verschieben von Gegenständen nur mit notifyDataSetChanged()

    1) Du benutzt notifyItemInserted(position); Oder notifyItemRemoved(position); Anstelle von notifyDataSetChanged() für Animation. 2) Du kannst dein Problem einfach manuell beheben

     public void move(int from, int to){ Track track = mArray.remove(from); mArray.add(to, track); notifyItemMoved(from, to); ViewHolder fromHolder = (ViewHolder) mRecyclerView.findViewHolderForPosition(from); ViewHolder toHolder = (ViewHolder) mRecyclerView.findViewHolderForPosition(to); Tag fromTag = fromHolder.itemView.getTag(); fromHolder.itemView.setTag(toHolder.itemView.getTag()); toHolder.itemView.setTag(fromTag); } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.