有按钮的ListView

但是有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮。添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上。但是事实并非这样,因为按钮是无法映射的,即使你成功的用布局文件显示出了按钮也无法添加按钮的响应,这时就要研究一下ListView是如何现实的了,而且必须要重写一个类继承BaseAdapter。下面的示例将显示一个按钮和一个图片,两行字如果单击按钮将删除此按钮的所在行。并告诉你ListView究竟是如何工作的。效果如下:

vlist2.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="horizontal"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent">
  6.  
  7. <ImageView android:id="@+id/img"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:layout_margin="5px"/>
  11.  
  12. <LinearLayout android:orientation="vertical"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content">
  15.  
  16. <TextView android:id="@+id/title"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:textColor="#FFFFFFFF"
  20. android:textSize="22px" />
  21. <TextView android:id="@+id/info"
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content"
  24. android:textColor="#FFFFFFFF"
  25. android:textSize="13px" />
  26.  
  27. </LinearLayout>
  28.  
  29. <Button android:id="@+id/view_btn"
  30. android:layout_width="wrap_content"
  31. android:layout_height="wrap_content"
  32. android:text="@string/s_view_btn"
  33. android:layout_gravity="bottom|right" />
  34. </LinearLayout>

程序代码:

  1. /**
  2. * @author allin
  3. *
  4. */
  5. public class MyListView4 extends ListActivity {
  6.  
  7. private List<Map<String, Object>> mData;
  8.  
  9. @Override
  10. public void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. mData = getData();
  13. MyAdapter adapter = new MyAdapter(this);
  14. setListAdapter(adapter);
  15. }
  16.  
  17. private List<Map<String, Object>> getData() {
  18. List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
  19.  
  20. Map<String, Object> map = new HashMap<String, Object>();
  21. map.put("title", "G1");
  22. map.put("info", "google 1");
  23. map.put("img", R.drawable.i1);
  24. list.add(map);
  25.  
  26. map = new HashMap<String, Object>();
  27. map.put("title", "G2");
  28. map.put("info", "google 2");
  29. map.put("img", R.drawable.i2);
  30. list.add(map);
  31.  
  32. map = new HashMap<String, Object>();
  33. map.put("title", "G3");
  34. map.put("info", "google 3");
  35. map.put("img", R.drawable.i3);
  36. list.add(map);
  37.  
  38. return list;
  39. }
  40.  
  41. // ListView 中某项被选中后的逻辑
  42. @Override
  43. protected void onListItemClick(ListView l, View v, int position, long id) {
  44.  
  45. Log.v("MyListView4-click", (String)mData.get(position).get("title"));
  46. }
  47.  
  48. /**
  49. * listview中点击按键弹出对话框
  50. */
  51. public void showInfo(){
  52. new AlertDialog.Builder(this)
  53. .setTitle("我的listview")
  54. .setMessage("介绍...")
  55. .setPositiveButton("确定", new DialogInterface.OnClickListener() {
  56. @Override
  57. public void onClick(DialogInterface dialog, int which) {
  58. }
  59. })
  60. .show();
  61.  
  62. }
  63.  
  64. public final class ViewHolder{
  65. public ImageView img;
  66. public TextView title;
  67. public TextView info;
  68. public Button viewBtn;
  69. }
  70.  
  71. public class MyAdapter extends BaseAdapter{
  72.  
  73. private LayoutInflater mInflater;
  74.  
  75. public MyAdapter(Context context){
  76. this.mInflater = LayoutInflater.from(context);
  77. }
  78. @Override
  79. public int getCount() {
  80. // TODO Auto-generated method stub
  81. return mData.size();
  82. }
  83.  
  84. @Override
  85. public Object getItem(int arg0) {
  86. // TODO Auto-generated method stub
  87. return null;
  88. }
  89.  
  90. @Override
  91. public long getItemId(int arg0) {
  92. // TODO Auto-generated method stub
  93. return 0;
  94. }
  95.  
  96. @Override
  97. public View getView(int position, View convertView, ViewGroup parent) {
  98.  
  99. ViewHolder holder = null;
  100. if (convertView == null) {
  101.  
  102. holder=new ViewHolder();
  103.  
  104. convertView = mInflater.inflate(R.layout.vlist2, null);
  105. holder.img = (ImageView)convertView.findViewById(R.id.img);
  106. holder.title = (TextView)convertView.findViewById(R.id.title);
  107. holder.info = (TextView)convertView.findViewById(R.id.info);
  108. holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
  109. convertView.setTag(holder);
  110.  
  111. }else {
  112.  
  113. holder = (ViewHolder)convertView.getTag();
  114. }
  115.  
  116. holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));
  117. holder.title.setText((String)mData.get(position).get("title"));
  118. holder.info.setText((String)mData.get(position).get("info"));
  119.  
  120. holder.viewBtn.setOnClickListener(new View.OnClickListener() {
  121.  
  122. @Override
  123. public void onClick(View v) {
  124. showInfo();
  125. }
  126. });
  127.  
  128. return convertView;
  129. }
  130.  
  131. }
  132.  
  133. }

  下面将对上述代码,做详细的解释,listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。

  系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的vlist2.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那 再绘制下一行,直到绘完为止。在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了。

运行效果如下图:

源码下载

有按钮的ListView的更多相关文章

  1. ListView初探

    一.ListView介绍 在Android开发中ListView是比较常用的控件,常用于以列表的形式显示数据集及根据数据的长度自适应显示. ListView通常有两个主要功能点: (1)将数据集填充到 ...

  2. Android 自定义ListView

    本文讲实现一个自定义列表的Android程序,程序将实现一个使用自定义的适配器(Adapter)绑定 数据,通过contextView.setTag绑定数据有按钮的ListView. 系统显示列表(L ...

  3. 安卓 android ListView 数据填充

    在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示.抽空把对ListView的使用做了整理,并写了个小例子,如下图. 列表的显示需要三 ...

  4. Android之listview && adapter

    今天我们讲的也是非常重要的一个控件listview-最常用也是最难的 一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView ...

  5. 【Android UI】Android ListView详解

    在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示.抽空把对ListView的使用做了整理,并写了个小例子,如下图. 列表的显示需要三 ...

  6. Android 实现ListView中Item被单击后背景色保持高亮

    今天为了解决一个需求,就是我有一个slidingDrawer,里面是一个ListView.然后,单击其中的Item,默认只是显示一个橙色背景后就恢复了.客户便有着个需求,需要单击这个Item的背景高亮 ...

  7. Android listview与adapter用法

    listview与adapter用法 博客分类: android   一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView ...

  8. ListView 和 Adapter用法

    一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView就是实现这个功能的.第二点也不难做到,在后面的学习中读者会发现,这非常 ...

  9. Android的ListView详解

    在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示.抽空把对ListView的使用做了整理,并写了个小例子,如下图. 列表的显示需要三 ...

随机推荐

  1. 在堆栈中,push为入栈操作,pop为出栈操作

    LinkedList提供以下方法:(ArrayList无此类方法) addFirst(); removeFirst(); addLast(); removeLast(); 在堆栈中,push为入栈操作 ...

  2. 将数据写入TXT文件中,file_put_contents与fwrite

    <?php header("content-type:text/html;charset=utf-8"); $file = './aa.txt'; ###判断是不是文件 if ...

  3. Math函数

    floor --将一个小数向下舍入为整数 float floor ( float $value ) 注意:floor返回的虽然是取整的数字 但是类型仍然是float类型. 实例: echo floor ...

  4. WPF 附加事件

    在WPF中有许多控件有他们自己的特殊的事件.按钮就是一个例子——它添加了 Click 事件,而其他任何类都没有定义该事件. 这回导致两难的境地.假设在 StackPanel 面板中包装了一堆按钮,并且 ...

  5. WPF进阶之接口(2):IDisposable,ICollectionView

    废话不多说,进入正题,先来说说IDisposable,看例子(来自MSDN): using System; using System.ComponentModel; // 下面的例子将展示一个实施了I ...

  6. C语言基础之水仙花数

    题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身. 例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方. 程序分析:利用for循 ...

  7. mciSendCommand 音频视频播放命令函数

    //打开设备 //typedef struct { //DWORD dwCallback;        //指定一个窗口句柄 //MCIDEVICEID wDeviceID;   //为成功打开的文 ...

  8. 电力项目十三--js添加浮动框

    修改page/menu/loading.jsp页面 首先,页面中引入浮动窗样式css <!-- 浮动窗口样式css begin --> <style type="text/ ...

  9. css 更改input radio checkbox的样式

    html <label> <input type="checkbox" class="colored-blue"> <span c ...

  10. 常用SEO优化技巧

    SEO是指搜索引擎优化 搜索引擎优化是一种利用搜索引擎的搜索规则来提高目前网站在有关搜索引擎内的自然排名的方式.SEO的目的理解是:为网站提供生态式的自我营销解决方案,让网站在行业内占据领先地位,从而 ...