android listview中插入按钮(或图片的)并添加监听器

来源:互联网 发布:数据挖掘工程师简历 编辑:程序博客网 时间:2024/05/18 10:17
        最近,刚搞android,要实现一个类似listview的东西,要其中每个item中均有不同的控件,且要每个控件均能接受点击事件并通知到底是哪个item中的哪个控件被点击了。

        之前,在网上看到类似的帖子,能够实现每个item中添加多个控件,却不能具体定位到是那个item中的那个控件被点击了。

        以下是具体代码,分析下具体步骤吧:

        1.数据来源:我这里用了一个函数产生getData();

        2.主要是需要一个Adapter:由于我们的item中控件的扩展性,自己写了一个(如果只是显示下图片,文字,没有监听器可以直接使用ArrayAdapter)。

        实现一个Adapter主要需要实现两个比较重要的函数public int getCount()和public View getView(int position, View convertView, ViewGroup parent),第一个函数返回显示的行数,第二个显示具体需要显示的内容。

        具体内容,在代码中均有注释,也不是很复杂,可以自己建一个工程试一试,但需要做些必要修改(因为我是直接从我工程中拷贝的)。

import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.util.AttributeSet;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;public class MListView extends ListView {private List<Map<String, Object>> m_Data;public MListView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}@Overridepublic void OnCreate(Context context, AttributeSet attrs) {// TODO Auto-generated method stubm_Data = getData();MyAdapter adapter = new MyAdapter(context);setAdapter(adapter);}//数据由外部数据源产生private List<Map<String, Object>> getData() {List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();Map<String, Object> map = new HashMap<String, Object>();map.put("title", "G1");map.put("info", "google 1");map.put("img", R.drawable.p16_0424);list.add(map);map = new HashMap<String, Object>();map.put("title", "G2");map.put("info", "google 2");map.put("img", R.drawable.p16_0424);list.add(map);map = new HashMap<String, Object>();map.put("title", "G3");map.put("info", "google 3");map.put("img", R.drawable.p16_0424);list.add(map);return list;}@Overridepublic void OnInitialize() {// TODO Auto-generated method stub}@Overridepublic void OnDestroy() {// TODO Auto-generated method stub}public final class ViewHolder{public ImageView img;public TextView title;public TextView info;}public class MyAdapter extends BaseAdapter{private LayoutInflater m_Inflater;public MyAdapter(Context context){this.m_Inflater = LayoutInflater.from(context);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn m_Data.size();}@Overridepublic Object getItem(int arg0) {// TODO Auto-generated method stubreturn null;}@Overridepublic long getItemId(int arg0) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {holder=new ViewHolder();  convertView = m_Inflater.inflate(R.layout.listviewitem, null);  //根据布局产生一个viewholder.img = (ImageView)convertView.findViewWithTag("imageView"); //这里使用tag进行查找,也可以用id进行查找holder.title = (TextView)convertView.findViewWithTag("textView1");holder.info = (TextView)convertView.findViewWithTag("textView2");convertView.setTag(holder);} else {holder = (ViewHolder)convertView.getTag();}holder.img.setBackgroundResource((Integer)m_Data.get(position).get("img"));holder.title.setText((String)m_Data.get(position).get("title"));holder.info.setText((String)m_Data.get(position).get("info"));ItemListener itemListener = new ItemListener(position); //监听器记录了所在行,于是绑定到各个控件后能够返回具体的行,以及触发的控件holder.img.setOnClickListener(itemListener);holder.title.setOnClickListener(itemListener);holder.info.setOnClickListener(itemListener);return convertView;}class ItemListener implements OnClickListener {        private int m_position;        ItemListener(int pos) {        m_position = pos;        }                @Override        public void onClick(View v) {        Log.v("MyListView-click", "line:" + m_position + ":"+ v.getTag());        }    }}}
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal" >    <ImageView        android:layout_width="30dp"        android:layout_height="30dp"        android:tag="imageView" />    <TextView        android:tag="textView1"                android:layout_width="wrap_content"        android:layout_height="30dp"        android:layout_marginLeft="30dp"        android:gravity="center" />    <TextView         android:tag="textView2"                      android:layout_marginLeft="30dp"                android:layout_width="wrap_content"        android:layout_height="30dp"        android:gravity="center" /></LinearLayout>
	
				
		
原创粉丝点击