1

Как получить новое значение позиции во время перетаскивания адаптера RecyclerView?Облицовочная проблема в позиции Значение во время перетаскивания в RecyclerView android

Перетаскивание работает идеально, но когда я устанавливаю setOnClickListener, чтобы открыть свою активность. он дает мне старую позицию.

Например:

Если я перетащить 2-й элемент (индекс 1) и падение в позиции 1-го элемента (INDEX 0).

Об отладке внутри setOnClickListener, когда я вызываю Intent. Значение позиции равно 1 (INDEX 1), но мне нужно значение 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); 
     } 
} 
  • перетаскивания я создал 2 классов.

    1) CustomItemTouchHelper расширяет ItemTouchHelper.Callback

класса

//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) интерфейс для метода OnMove

void onMove(int oldPosition, int newPosition); 

Реализован этот метод в деятельности

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

интерфейс реализован в деятельности.

onMove(int oldPosition, int newPosition) { 
    Collections.swap(mNames, oldPosition, newPosition); 
    adapter.notifyItemMoved(oldPosition, newPosition); 
} 
  • ПРАВИЛЬНО или ГИД меня, если некоторые вещи не хватает.
  • Thanks & С уважением.
+0

Возможно, у вас возникла проблема с вызовом 'swap()' не делать того, что вы имеете в виду? См. Https://stackoverflow.com/a/46363659/172690 для возможного решения. –

ответ

1

Убедитесь, что вы переопределите метод getItemId(), который возвращает уникальное значение для вашего адаптера.

+0

Hi Emre, Override getItemId с каким случаем?. просто правый этот метод с супер-вызовом.? потому что при нажатии мне нужно текущее значение позиции не старое. – abhishek

0

При использовании перетаскивания & drop with recyclerView, позиции замешаны. Затем, когда вы делаете что-то, где вы передаете позицию (например, анимацию, например), неправильный элемент получает желаемое действие.

Чтобы получить фактическое текущее положение элемента, добавить метод в адаптер:

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

, а затем вызвать это вместо того, чтобы получить позицию.

Смежные вопросы