Android中ListView响应Item内部点击事件

ListView(GridView)是我们在实际开发中经常用到的,一般的Item也会随着需求,增加很多功能,比如单个item的点击事件,比如我们购物时,单个物品的点击+和-,表示选择数量,即响应item的内部点击事件,同时又不能和整体item的点击事件冲突。当然我们可以直接在adpter的getView中直接做内部按钮的点击处理,但是这样写的化,按钮一多的话,就显得整体代码比较拥挤,而且把Activity的点击事件放在adpter中,用起来有时会不方便。为此,我们可以使用接口回调的方式进行处理,让其在Activity中去响应,增加其灵活性。

关于什么是接口回调,可以参考我以前的博文------>>> java笔记--什么是接口回调,怎么用?

代码如下:

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;

public class ListItemAdapter extends BaseAdapter implements OnClickListener {
	private List mList;
	private Context mContext;
	private InnerItemOnclickListener mListener;

	public ListItemAdapter(List 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

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 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();
		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 + "");
	}

}

整体效果

Android中ListView响应Item内部点击事件_第1张图片
Android中ListView响应Item内部点击事件_第2张图片

当然,也还有另一种实现方式,通过抽象类来回调,其实两个都本质是一样的,接口本身和抽象类类似。

当时在实现时,点击item时,响应不了整体item的点击事件,后来想了想,好像以前遇到过,Android ListView中Item点击事件失效解决方案 看来是记性不好,很久不实践,期间也是经历了导师风波,导致学习的进度耽搁了,心态也变得有点懒散了,大半个月不写总结了,习惯不能断,路还很遥远,歇好了就继续上路吧,加油!

你可能感兴趣的:(Android)