Android中點選事件回撥介面踩坑心得
阿新 • • 發佈:2018-12-18
有時候寫程式碼的時候有這樣的功能要求,如在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()); } });