【问题标题】:Facing issue in Position value during Drag and drop in RecyclerView android在RecyclerView android中拖放期间面临位置值问题
【发布时间】: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);
}
  • 如果缺少某些东西,请纠正或指导我。
  • 感谢和问候。

【问题讨论】:

标签: android drag-and-drop android-recyclerview adapter positioning


【解决方案1】:

确保覆盖在适配器上返回唯一值的 getItemId() 方法。

【讨论】:

  • 嗨 Emre,用什么情况覆盖 getItemId?用超级调用简单地对这个方法。?因为点击时我需要当前位置值不旧。
【解决方案2】:

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

然后调用它来获取位置。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。 问题是拖动后,传递给onBindViewHolder的“位置”会改变,但onBindViewHolder再也不会被调用,所以我们不能在onClick方法中依赖它。 在 onBindViewHolder 中,而不是:

    intent.putExtra("NAME_POSITION", position);
    

    使用这个:

    @Override
    public void onBindViewHolder(final ItemViewHolder holder, final int position) {
    
        final Object listItem = list.get(position);
    
        holder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(activity, DetailActivity.class);
                intent.putExtra("NAME_POSITION", list.indexOf(item);
                intent.putParcelableArrayListExtra("NAME_LIST", mName);
                ((Activity) context).startActivityForResult(intent, 800);
            }
     }
    

    附注,但您还需要更改 Collections.swap 代码。如果您快速拖动多个点,它将弄乱顺序。改用这个:

    if (fromPosition < toPosition) {
        for (int i = fromPosition; i < toPosition; i++) {
            Collections.swap(list, i, i + 1);
        }
    } else {
        for (int i = fromPosition; i > toPosition; i--) {
            Collections.swap(list, i, i - 1);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多