1

Wie erhalte ich beim Ziehen und Ablegen des RecyclerView-Adapters einen neuen Positionswert?Problem beim Positionswert beim Ziehen und Ablegen in RecyclerView android

Drag and Drop funktioniert perfekt, aber wenn ich setOnClickListener zu öffnen, um meine Detailaktivität zu öffnen. es gibt mir den alten Positionswert.

Zum Beispiel:

Wenn i zweites Element ziehen (INDEX 1) und Drop in der 1. Position des Objekts (Index 0).

Beim Debuggen in SetOnClickListener, wenn ich Intent aufrufen. Positionswert ist 1 (INDEX 1), aber was ich brauche, ist der Wert 0 (INDEX 0).

@Override 
public void onBindViewHolder(final ItemViewHolder holder, final int position) { 
    holder.textView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(activity, DetailActivity.class); 
       intent.putExtra("NAME_POSITION", position); 
       intent.putParcelableArrayListExtra("NAME_LIST", mName); 
       ((Activity) context).startActivityForResult(intent, 800); 
     } 
} 
  • Für Drag & Drop-i 2 Klassen erstellt haben.

    1) CustomItemTouchHelper erstreckt ItemTouchHelper.Callback

Klasse

//Interface interface 

public ItemTouchHelper(Interface interface) { 
    this.interface = interface; 
} 

@Override 
public boolean isLongPressDragEnabled() { 
    return true; 
} 

@Override 
public boolean isItemViewSwipeEnabled() { 
    return false; // swiped disabled 
} 

@Override 
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 
    int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; // movements drag 
    return makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, dragFlags); // as parameter, action drag and flags drag 
} 

@Override 
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
    interface.onMove(viewHolder.getAdapterPosition(), target.getAdapterPosition()); // information to the interface 
    return true; 
} 

@Override 
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 
    // swiped disabled 
}  

2) Schnittstelle für OnMove Methode

void onMove(int oldPosition, int newPosition); 

diese Methode in der Aktivität Implementiert

ItemTouchHelper.Callback callback = new CustomItemTouchHelper(this); 
    ItemTouchHelper touchHelper = new ItemTouchHelper(callback); 
    touchHelper.attachToRecyclerView(list); 

Schnittstelle in Aktivität implementiert.

onMove(int oldPosition, int newPosition) { 
    Collections.swap(mNames, oldPosition, newPosition); 
    adapter.notifyItemMoved(oldPosition, newPosition); 
} 
  • RICHTIG oder mich leiten, wenn etwas, was fehlt.
  • Danke & Grüße.
+0

Vielleicht haben Sie ein Problem mit dem 'swap()' Anruf nicht, was Sie meinen? Eine mögliche Lösung finden Sie unter https://stackoverflow.com/a/46363659/172690. –

Antwort

1

Stellen Sie sicher, dass Sie die getItemId() -Methode überschreiben, die einen eindeutigen Wert auf Ihrem Adapter zurückgibt.

+0

Hallo Emre, überschreibe getItemId mit welchem ​​Fall? einfach richtig diese Methode mit Super Call.? weil beim Klicken brauche ich den aktuellen Positionswert nicht alt. – abhishek

0

Bei der Verwendung von Ziehen & Drop mit RecyclerView werden die Positionen verwechselt. Wenn Sie dann etwas tun, bei dem Sie die Position übergeben (z. B. eine Animation), wird das falsche Element die gewünschte Aktion ausgeführt.

Um die tatsächliche aktuelle Position des Elements zu erhalten, ein Verfahren in Ihrem Adapter hinzufügen:

private int getItemPosition(Item item){ // (<-- replace with your item) 
    int i = 0; 
    // (replace with your items and methods here) 
    for (Item currentItem : mItems) { 
     if (currentItem.getItemId() == item.getItemId()) break; 
     i++; 
    } 
    return i; 
} 

und diese dann stattdessen rufen Sie die Position zu bekommen.