android 取消item中巢狀的RecycleView的點選事件
阿新 • • 發佈:2019-02-05
問題來源:
我們的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,問題暫時得到了解決,整塊區域都可以被點選,並響應點選事件,遇到這個問題的小夥伴也可以試試這個方法...