有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java能够在RecyclerView中同时单击两个项目

我在RecyclerView中有一个项目列表,我在onBindViewHolder中为每个视图设置了onClickListener。click侦听器工作得很好,问题是我可以同时单击列表中的两个项目,它们都将运行onClick方法。当您有ListView时,如果您试图同时单击两个项目,则不允许

例如:
假设您已经在listview中触摸了一个项目,在此期间您尝试触摸另一个项目,但它不允许您触摸。回收视图允许这样做

单击时,如何使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());
        }
    }
}

共 (2) 个答案

  1. # 1 楼答案

    我的RecyclerView是以编程方式添加到Java中的,而不是xml。我试了一下,效果很好:

    mRecyclerView.setMotionEventSplittingEnabled(false);
    

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

    android:splitMotionEvents="false"
    

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

  2. # 2 楼答案

    不幸的是,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
    }