android listview中插入按鈕(或圖片的)並新增監聽器
阿新 • • 發佈:2019-01-07
最近,剛搞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>