我在RecyclerView中有一个项目列表,我在每个视图的onBindViewHolder中设置了onClickListener。点击监听器工作正常,问题是我可以同时点击列表中的两个项目,它们都将运行他们的onClick方法。当你有ListViews时,如果你试图同时点击两个项目,它就不允许你。
例如:
假设您已经触及列表视图中的某个项目,并且在此期间您尝试触摸其赢得的其他项目。 Recyclerview允许这样做。
如何在点击?
时使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());
}
}
}
答案 0 :(得分:12)
我的RecyclerView以编程方式添加Java,但不是xml。我试试这个并且有效:
mRecyclerView.setMotionEventSplittingEnabled(false);
如果您的RecyclerView是以xml格式添加的,您可以尝试在RecyclerView中添加它:
android:splitMotionEvents="false"
现在在回收商列表中,当您点击一个项目而不放手时,您无法点击另一个项目。
答案 1 :(得分:0)
不幸的是,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
}