【发布时间】:2016-09-18 20:30:20
【问题描述】:
在 RecyclerView 适配器中拖放期间如何获取新的位置值?
拖放工作完美,但是当我设置 setOnClickListener 来打开我的详细活动时。它给了我旧的位置值。
例如:
如果我拖动第二个项目 (INDEX 1) 并放在第一个项目的位置 (INDEX 0)。
在调用 Intent 时在 setOnClickListener 内部进行调试。位置值为 1(索引 1),但我需要的是值 0(索引 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);
在activity中实现了这个方法
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);
}
- 如果缺少某些东西,请纠正或指导我。
- 感谢和问候。
【问题讨论】:
-
也许您对
swap()呼叫不符合您的意思有疑问?请参阅stackoverflow.com/a/46363659/172690 了解可能的解决方案。
标签: android drag-and-drop android-recyclerview adapter positioning