android 能够在RecyclerView中同时点击两个项目

hyrbngr7  于 2023-04-18  发布在  Android
关注(0)|答案(2)|浏览(135)

我在RecyclerView中有一个项目列表,我在onBindViewHolder中为每个视图设置了onClickListener。单击侦听器工作正常,问题是我可以同时单击列表中的两个项目,它们都会运行它们的onClick方法。当你有ListViews时,如果你试图同时单击两个项目,它不允许你。
例如:
假设你已经在列表视图中的一个项目上触摸了,在此期间你试图触摸另一个项目,它不会让你。
我们怎样才能使RecyclerView在点击时像ListView一样工作?
下面是我的实现

public class DataCardAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context mContext;
    private ArrayList<Data> mDatas = new ArrayList<>();
    private Data mData;

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View card = LayoutInflater.from(mContext).inflate(R.layout.card, parent, false);
        return  new DataCardViewHolder(mContext, card, mData);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        Data data = mDatas.get(position);
        ((DataCardViewHolder )holder).configureDataCard(data);
    }

    public static class DataCardViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        private Context mContext;
        private Data mData;

        public DataCardViewHolder(Context context, View view, Data data) {
            super(view);
            mContext = context;
            mData= data;
        }

        public void configureDataCard(final Data data) {
            mData= data;
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            Log.v("DataCardViewHolder","onClick with data: " + mData.getData().toString());
        }
    }
}
mrzz3bfm

mrzz3bfm1#

我的RecyclerView是在Java中编程添加的,但不是在xml中。我尝试了这个,它工作:

mRecyclerView.setMotionEventSplittingEnabled(false);

如果您的RecyclerView是在xml中添加的,您可以尝试在RecyclerView中添加以下内容:

android:splitMotionEvents="false"

现在在回收列表中,当你点击一个项目并不放手时,你不能点击另一个项目。

ee7vknir

ee7vknir2#

不幸的是,RecyclerView不会为您处理这个问题。创建一个带超时的Handler

public class DelayedClick {
    protected boolean canClick = true;
    protected Handler myHandler = new Handler();

    private Runnable mMyRunnable = new Runnable()
    {
        @Override
        public void run() {
            canClick = true;
        }
    };

    public boolean getState() {
        if(canClick) {
            myHandler.postDelayed(mMyRunnable, 200);
            canClick = false;
            return true;
        }
        else return false;
    }
}

@Override
public void onClick(View v) {
    if (!reClick.getState()) {
        return;
    }
    //Code to execute on click
}

相关问题