现在的位置: 首页 > 综合 > 正文

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

2018年03月18日 ⁄ 综合 ⁄ 共 4200字 ⁄ 字号 评论关闭

        最近,刚搞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
	}

	@Override
	public void OnCreate(Context context, AttributeSet attrs) {
		// TODO Auto-generated method stub
		m_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;
	}

	@Override
	public void OnInitialize() {
		// TODO Auto-generated method stub

	}

	@Override
	public 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);
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return m_Data.size();
		}

		@Override
		public Object getItem(int arg0) {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public long getItemId(int arg0) {
			// TODO Auto-generated method stub
			return 0;
		}

		@Override
		public 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);	  //根据布局产生一个view
				holder.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>

抱歉!评论已关闭.