有时候写代码的时候有这样的功能要求,如在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());
}
});