首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多ItemTouchHelper与多ViewType

多ItemTouchHelper与多ViewType
EN

Stack Overflow用户
提问于 2017-02-07 04:27:58
回答 2查看 1.1K关注 0票数 5
代码语言:javascript
复制
public class ItemCallBack extends ItemTouchHelper.Callback {
private BaseDragAdapter adapter;
private List list;

public ItemCallBack(BaseDragAdapter adapter, List list) {
    this.adapter = adapter;
    this.list = list;
}

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    int dragFlags = 0; 
    int swipeFlags = 0;  
    int startPosition = viewHolder.getAdapterPosition();
    if (startPosition != 0) {
        if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
            dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
        } else if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
            dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        } else if (recyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager) {
            dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
        }
    }
    return makeMovementFlags(dragFlags, swipeFlags);
}

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
    int startPosition = viewHolder.getAdapterPosition();
    int targetPosition = target.getAdapterPosition();
    adapter.onMoved(startPosition, targetPosition);
    return true;
}

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {  //左右拖动删除
    int position = viewHolder.getAdapterPosition();
    adapter.onSwiped(position);
}

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

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


@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
    if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
        viewHolder.itemView.setScaleX(1.2f);
        viewHolder.itemView.setScaleY(1.2f);
    }
    super.onSelectedChanged(viewHolder, actionState);
}

@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    super.clearView(recyclerView, viewHolder);
    viewHolder.itemView.setScaleX(1.0f);
    viewHolder.itemView.setScaleY(1.0f);
    onOrderListener.order();
}


@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
    super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}

private OnOrderListener onOrderListener;

public void setOnPictureClickListener(OnOrderListener onOrderListener) {
    if (onOrderListener != null) {
        this.onOrderListener = onOrderListener;
    }
}

public interface OnOrderListener {
    void order();
}

}

代码语言:javascript
复制
@Override
public int getItemViewType(int position) {
    if (position == 0) {
        return TYPE_ADD;
    } else if (position == 1) {
        return TYPE_COVER;
    }
    return TYPE_NORMAL;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == TYPE_ADD) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_upload_pic_add, null);
        return new AddHolder(view);
    } else if (viewType == TYPE_COVER) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_upload_pic_cover, null);
        return new CoverHolder(view);
    }  else {
        View view = LayoutInflater.from(context).inflate(R.layout.item_upload_pic_normal, null);
        return new NormalHolder(view);
    }
}

我想和ItemTouchHelper交换商品。

问题是:

当我拖动和交换视图类型为TYPE_NORNAL的项目时,动画效果很好; 但是,当我尝试在不同类型(ex:TYPE_NORMAL和TYPE_COVER)之间切换时,动画无法正确执行。

如何使动画正确执行?

EN

回答 2

Stack Overflow用户

发布于 2017-05-30 12:57:03

我也有过同样的问题。用定形重新装饰它

setHasStableIds(真);

在适配器上,并覆盖getItemId(),以便为适配器中的每个项返回唯一的id。如果项目没有唯一的id,则可以在获得适配器的新项目时生成Map并生成这些id。然后在getItemId()中查找这些id,使用item作为键。

票数 1
EN

Stack Overflow用户

发布于 2021-12-01 11:01:59

重写getMovementFlags并设置swipeFlags依赖于viewType

代码语言:javascript
复制
    override fun getMovementFlags(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder
    ): Int {
        val swipeFlags = if (viewHolder.itemViewType == ListItem.TYPE_BODY)
            ItemTouchHelper.RIGHT
        else 0

        return makeMovementFlags(0, swipeFlags)
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42081727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档