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