我尝试在适配器内使用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);
看起来您正在 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
}
});
希望这个解决方案有效。