分享

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

 liang1234_ 2016-06-19
        最近,刚搞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> 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> getData() { List> list = new ArrayList>(); Map map = new HashMap(); map.put('title', 'G1'); map.put('info', 'google 1'); map.put('img', R.drawable.p16_0424); list.add(map); map = new HashMap(); map.put('title', 'G2'); map.put('info', 'google 2'); map.put('img', R.drawable.p16_0424); list.add(map); map = new HashMap(); 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()); } } }}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多