ListView可以说是我们在实际开发中最常用到的控件了。可以说每一个app都需要用到listview来显示列表,如果我们需要点击listView的不同按钮跳转到不同页面,具体逻辑在重写的onItemClick()方法中实现,这里不多说,不了解listView基本用法的小伙伴们可以去百度一下listView的基本用法,而button的点击事件实现的具体逻辑在重写的onClick()方法中实现。那么当我们要实现单个item的点击事件应该怎么实现呢?比如我们购物时,单个物品的点击+和-,表示选择数量,即响应item的内部点击事件,同时又不能和整体item的点击事件冲突。当然我们可以直接在adpter的getView中直接做内部按钮的点击处理,但是这样写的化,按钮一多的话,就显得整体代码比较拥挤,而且把Activity的点击事件放在adpter中,用起来有时会不方便。为此,我们可以使用接口回调的方式进行处理,让其在Activity中去响应,增加其灵活性。
代码如下:
adapter:
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
public class ListItemAdapter extends BaseAdapter implements OnClickListener {
private List<String> mList;
private Context mContext;
private InnerItemOnclickListener mListener;
public ListItemAdapter(List<String> mList, Context mContext) {
this.mList = mList;
this.mContext = mContext;
}
@Override
public int getCount() {
// TODO 自动生成的方法存根
return mList.size();
}
@Override
public Object getItem(int position) {
// TODO 自动生成的方法存根
return mList.get(position);
}
@Override
public long getItemId(int position) {
// TODO 自动生成的方法存根
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.item,
null);
viewHolder.bt1 = (Button) convertView.findViewById(R.id.bt1);
viewHolder.bt2 = (Button) convertView.findViewById(R.id.bt2);
viewHolder.tv = (TextView) convertView.findViewById(R.id.tv);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.bt1.setOnClickListener(this);
viewHolder.bt2.setOnClickListener(this);
viewHolder.bt1.setTag(position);
viewHolder.bt2.setTag(position);
viewHolder.tv.setText(mList.get(position));
return convertView;
}
public final static class ViewHolder {
Button bt1, bt2;
TextView tv;
}
interface InnerItemOnclickListener {
void itemClick(View v);
}
public void setOnInnerItemOnClickListener(InnerItemOnclickListener listener){
this.mListener=listener;
}
@Override
public void onClick(View v) {
mListener.itemClick(v);
}
}
MainActivity.java
import java.util.ArrayList;
import java.util.List;
import com.example.listitemdemo.ListItemAdapter.InnerItemOnclickListener;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
public class MainActivity extends Activity implements InnerItemOnclickListener,
OnItemClickListener {
private ListView mList;
private List<String> mDataList;
private ListItemAdapter mAdapter;
private static final String[] Datas = { "北京", "上海", "广州", "深圳", "苏州", "南京",
"武汉", "长沙", "杭州", "长春", "无锡", "常州", "绍兴", "嘉兴", "衢州" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
mDataList = new ArrayList<String>();
for (int i = 0; i < Datas.length; i++) {
mDataList.add(Datas[i]);
}
mAdapter = new ListItemAdapter(mDataList, this);
mAdapter.setOnInnerItemOnClickListener(this);
mList.setAdapter(mAdapter);
mList.setOnItemClickListener(this);
}
private void initView() {
mList = (ListView) findViewById(R.id.lv);
}
@Override
public void itemClick(View v) {
int position;
position = (Integer) v.getTag();
switch (v.getId()) {
case R.id.bt1:
Log.e("内部item--1-->", position + "");
break;
case R.id.bt2:
Log.e("内部item--2-->", position + "");
break;
default:
break;
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Log.e("整体item----->", position + "");
}
}
我们在ListItemAdapter中自定义一个接口以及抽象方法itemClick(),在MainActivity中实现此接口从而重写itemClick(),并且通过调用setOnInnerItemOnClickListener(InnerItemOnclickListener listener)将实现此接口的类的对象传入,当我们点击按钮时会调用OnClick()方法,在此方法里面会调用子类重写的itemClick()方法,而方法里的参数v指的就是点击的button。所以我们只要在重写的itemClick()方法 里实现点击后的逻辑即可。
整体效果: