ItemTouchHelper startSwipe 不起作用

问题描述 投票:0回答:1

我尝试在适配器内使用startSwipe,但似乎不起作用。奇怪的是,当我尝试用手指手动滑动它时,它起作用了。只是当我单击支架内的按钮时,startSwipe 不起作用。需要这方面的帮助~

这是我调用 startSwipe 的地方(在 onCreateViewHolder 方法中)。

final ViewHolder holder = new ViewHolder(rootView);
holder.rightItemLayout.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        mItemTouchHelper.startSwipe(holder);
    }
});

这就是我设置 ItemTouchHelper 的方式:

mItemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        return true;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

    }
});

ItemTouchHelper 如何附加到 recyclerView:

RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());

CategoryAdapter adapter = new CategoryAdapter(this, items);
recyclerView.setAdapter(adapter);
adapter.getItemTouchHelper().attachToRecyclerView(recyclerView);
android swipe itemtouchhelper
1个回答
0
投票

看起来您正在 onCreateViewHolder 中调用 mItemTouchHelper.startSwipe(holder) ,但此时该项目可能尚未完全附加到 RecyclerView 。您应该在 onBindViewHolder 中调用它,其中 Holder 已完全准备好并附加到 RecyclerView。

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    holder.rightItemLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mItemTouchHelper.startSwipe(holder);
        }
    });
}

您在 ItemTouchHelper 中提供的 SimpleCallback 仅支持向左滑动(ItemTouchHelper.LEFT)。确保您尝试滑动的项目可以朝该方向滑动。您可以通过添加左右滑动标志来测试多个方向的滑动:

new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        return true;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        // Handle swipe action
    }
}

此外,确保 ItemTouchHelper 正确附加到 RecyclerView。您提到使用adapter.getItemTouchHelper().attachToRecyclerView(recyclerView);,但请仔细检查适配器的初始化和附加ItemTouchHelper的方法。确保在活动/片段中正确调用它。

视图持有者内的 rightItemLayout 单击侦听器可能正在消耗触摸事件,这可能会阻止 startSwipe 工作。您可以尝试禁用父视图或按钮的点击拦截,看看是否有帮助。

holder.rightItemLayout.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return false;  // Return false to allow touch event to propagate to ItemTouchHelper
    }
});

希望这个解决方案有效。

© www.soinside.com 2019 - 2024. All rights reserved.