问题来源:
我们的android适配器中,常常会在item中嵌套一层RecycleView,比如这样...
但是,当我们设置整块区域的点击事件之后,RecycleView的区域(及圆形logo区域)并不响应点击事件...
代码是这样的:
xml的代码:
<LinearLayout android:id="@+id/ll_item" android:layout_width="match_parent" android:layout_height="60dp" android:orientation="vertical" > <android.support.v7.widget.RecyclerView android:id="@+id/rlv_item" android:layout_width="match_parent" android:layout_height="30dp"/> </LinearLayout>
adapter中的代码:
public class RecycleViewAdapter extends RecyclerView.Adapter<RecycleViewAdapter.VH> { private Context context; public RecycleViewAdapter(Context context){ this.context = context; } @Override public VH onCreateViewHolder(ViewGroup parent, int viewType) { return new VH(LayoutInflater.from(context).inflate(R.layout.layout_item,null)); } @Override public void onBindViewHolder(VH holder, final int position) { holder.ll_item.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context,"点击了第"+(position+1)+"个",Toast.LENGTH_SHORT).show(); } }); } @Override public int getItemCount() { return 5; } static class VH extends RecyclerView.ViewHolder{ private LinearLayout ll_item; private RecyclerView rlv_item; public VH(View itemView) { super(itemView); ll_item = (LinearLayout) itemView.findViewById(R.id.ll_item); rlv_item = (RecyclerView) itemView.findViewById(R.id.rlv_item); } } }
在onBindViewHolder()中,我们想设置LinearLayout的点击事件,但是RecycleView并不会执行点击的事件...
问题解决:
其实问题是在RecycleView的onTouchEvent函数里面,首先会调用dispatchOnItemTouch函数进行一些工作,但是当我们重写RecycleView的onTouchListener()后,在RecycleView分发点击事情之前会调用我们添加的OnItemTouchListener对象,所以我们可以这样做...
@Override public void onBindViewHolder(final VH holder, final int position) { holder.ll_item.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context,"点击了第"+(position+1)+"个",Toast.LENGTH_SHORT).show(); } }); holder.rlv_item.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return holder.ll_item.onTouchEvent(event); } }); }
ok,问题暂时得到了解决,整块区域都可以被点击,并响应点击事件,遇到这个问题的小伙伴也可以试试这个方法...