1. 程式人生 > >Android中點選事件回撥介面踩坑心得

Android中點選事件回撥介面踩坑心得

有時候寫程式碼的時候有這樣的功能要求,如在ListView或recyclerView中的Item中的控制元件(如Button,TextView)上添加回調介面事件。其實難點就在添加回調介面事件上,怎麼寫介面,介面回撥在哪裡,這才是關鍵。下面是個例子:

介面的寫法:一下是兩介面

//1.定義介面
    public interface OnTelePhoneClickListener {
        void onTelephoneClick(GroupMemberBean bean);
    }

    //2.宣告介面
    public OnTelePhoneClickListener onTelePhoneClickListener;

    //設定介面監聽的方法
    public void setOnTelePhoneClickListener(OnTelePhoneClickListener listener){
        this.onTelePhoneClickListener = listener;
    }



    //1.定義介面
    public interface OnLineClickListener {
        void onLineCLickListener(GroupMemberBean bean);
    }
    //2.宣告介面
    private OnLineClickListener onLineClickListener;
    //暴露介面方法
    public void setOnLineClickListener(OnLineClickListener listener){
        this.onLineClickListener = listener;
    }

介面設定的監聽位置,這個很重要,如果監聽位置不當,得不到想要的效果,下面是程式碼:

//獲取Item的佈局和設定監聽的位置
    @Override
    public View getView(final int position, View view, ViewGroup parent) {
        ViewHolder viewHolder = null;
        final GroupMemberBean mContent = list.get(position);
        if (view == null){
            viewHolder = new ViewHolder();
//            view = LayoutInflater.from(context).inflate(R.layout.company_item,null);
            view = LayoutInflater.from(context).inflate(R.layout.company_item,parent,false);
            viewHolder.tv_company = view.findViewById(R.id.tv_company);
            viewHolder.tv_letter = view.findViewById(R.id.tv_letter);
            viewHolder.btn_phone = view.findViewById(R.id.btn_phone);
            viewHolder.btn_online = view.findViewById(R.id.btn_online);

            //特別注意:給每一個item新增點選監聽  不能寫在這裡,請看下面:
            //監聽不能寫在這裡面,這裡的程式碼只有view第一次建立的時候才會走,之後就不再走此程式碼,
            // 所以點選Item的時候就會拿不到對應的Item的資料
            //因此將點選回撥監聽寫在view建立過程之外
            /*viewHolder.btn_phone.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    GroupMemberBean bean = list.get(position);
                    onTelePhoneClickListener.onTelephoneClick(bean);
                    Log.d("TEST", "onItemClick: 點選電話 " + bean.getPhoneNumber() + bean.getName());
                }
            });

            viewHolder.btn_online.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    GroupMemberBean bean = list.get(position);
                    onTelePhoneClickListener.onTelephoneClick(bean);
                    Log.d("TEST", "onItemClick: 點選電話 " + bean.getPhoneNumber() + bean.getName());
                }
            });*/
            view.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) view.getTag();
        }
//正確的監聽位置應該寫在這裡,即等item佈局拿到以後再設定點選事件並回傳資料
        viewHolder.btn_phone.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onTelePhoneClickListener.onTelephoneClick(list.get(position));
            }
        });

        viewHolder.btn_online.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onLineClickListener.onLineCLickListener(list.get(position));
            }
        });

        viewHolder.tv_company.setText(this.list.get(position).getName());
        return view;
    }

設定完介面,然後再MainActivity中回撥介面,下面是回撥方法:

sortListView.setAdapter(adapter);//設定佈局

adapter.setOnTelePhoneClickListener(new SortItemAdapter.OnTelePhoneClickListener() {
            @Override
            public void onTelephoneClick(GroupMemberBean bean) {
//獲取到item傳來的資料
                Log.d("LISTENER", "onTelephoneClick: LISTENER" + bean.getName() + bean.getPhoneNumber());
            }
        });

        adapter.setOnLineClickListener(new SortItemAdapter.OnLineClickListener() {
            @Override
            public void onLineCLickListener(GroupMemberBean bean) {
//獲取到item傳來的資料
                Log.d("ONLINELISTENER", "onLineCLickListener: " + bean.getName() + bean.getPhoneNumber());
            }
        });