RecyclerView перетаскивать индекс сортировки неправильно - PullRequest
0 голосов
/ 13 сентября 2018

Я использую ItemTouchHelper для достижения сортировки перетаскивания RecyclerView. Проблема в том, что ViewHolder изменился, но индекс ViewHolder не изменился. В чем дело? Спасибо !!!

ItemTouchHelperCallback:

   @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        if (viewHolder.getItemViewType() != target.getItemViewType()) {
            return false;
        }
        adapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

адаптер:

@Override
public void onItemMove(int fromPosition, int toPosition) {
    Collections.swap(mData, fromPosition, toPosition);
    notifyItemMoved(fromPosition, toPosition);
}

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

@ pskink @Monika Arora Большое спасибо. Когда я добавляю adapter.notifyDataSetChanged(); к методу clearView класса ItemTouchHelperCallback, позиция ViewHolder является правильной. Как следует:

    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        if (viewHolder instanceof PublishAdapter.PublishPhotoViewHolder) {
            viewHolder.itemView.setScaleX(1.0f);
            viewHolder.itemView.setScaleY(1.0f);
            // new line
            adapter.notifyDataSetChanged();
        } else {
            super.clearView(recyclerView, viewHolder);
        }

    }
0 голосов
/ 13 сентября 2018

Надеюсь, что это работает для вас

SwipeAndDragHelper swipeAndDragHelper = new SwipeAndDragHelper(adapter);
ItemTouchHelper touchHelper = new ItemTouchHelper(swipeAndDragHelper);
adapter.setTouchHelper(touchHelper);
recyclerview.setAdapter(adapter);
touchHelper.attachToRecyclerView(recyclerview);

// SwipeAndDragHelper class

public class SwipeAndDragHelper extends ItemTouchHelper.Callback {
private ActionCompletionContract contract;

public SwipeAndDragHelper(ActionCompletionContract contract) {
    this.contract = contract;
}

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {

    int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
    int swipeFlags = 0;
    return makeMovementFlags(dragFlags, swipeFlags);
}

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
    contract.onViewMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
    return true;
}

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
 //   contract.onViewSwiped(viewHolder.getAdapterPosition());
}

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

@Override
public void onChildDraw(Canvas c,
                        RecyclerView recyclerView,
                        RecyclerView.ViewHolder viewHolder,
                        float dX,
                        float dY,
                        int actionState,
                        boolean isCurrentlyActive) {
    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
        float alpha = 1 - (Math.abs(dX) / recyclerView.getWidth());
        viewHolder.itemView.setAlpha(alpha);
    }
    super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}

public interface ActionCompletionContract {
    void onViewMoved(int oldPosition, int newPosition);

    void onViewSwiped(int position);
}

}

// вызов метода касания

holder.imageview.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
                        touchHelper.startDrag(holder);
                    }
                    return false;
                }
            });


public void setTouchHelper(ItemTouchHelper touchHelper) {
    this.touchHelper=touchHelper;
}

// Реализуем метод

public class CustomDetail extends RecyclerView.Adapter<CustomDetail.ViewHolder>    implements
    SwipeAndDragHelper.ActionCompletionContract {




@Override
public void onViewMoved(int oldPosition, int newPosition) {
    FavouriteListResponse.Data listdat=listview.get(oldPosition);
    listview.remove(oldPosition);
    listview.add(newPosition, listdat);
    notifyItemMoved(oldPosition, newPosition);

}

@Override
public void onViewSwiped(int position) {
    listview.remove(position);
    notifyItemRemoved(position);
}
...