1. 程式人生 > >android 取消item中巢狀的RecycleView的點選事件

android 取消item中巢狀的RecycleView的點選事件

問題來源:

        我們的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,問題暫時得到了解決,整塊區域都可以被點選,並響應點選事件,遇到這個問題的小夥伴也可以試試這個方法...