在Android中实现Listview对新人来说比较难以理解,本人看了若干文章后觉得可以使用以下思路来让新人更好理解(同时也做好记录,免得自己以后忘记)。

可参考博客:http://cinderella7.blog.51cto.com/7607653/1281696  (这里用MVC的思想去理解Listview,个人认为还是不错的)

      http://blog.csdn.net/jueblog/article/details/11857281   (一个完整的实现)

--------------------------------------------------------------------------分割线-----------------------------------------------------------------

一、理顺整个思路。

自定义Listview中包含三个重要概念,这里用MVC的形式去理解:  

  ListView相当于MVC框架中的V(视图)

  Adapter相当于MVC框架中的C(控制器)

  数据源相当于MVC框架中的M(模型)

二、一步一步实现

  1、先自定义listview中每个Item子项的布局

listitem.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:orientation="vertical"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent">
  7.  
  8. <ImageView
  9. android:layout_width="fill_parent"
  10. android:layout_height="100dp"
  11. android:id="@+id/imageView"/>
  12. <TextView
  13. android:layout_width="fill_parent"
  14. android:layout_height="wrap_content"
  15. android:textAppearance="?android:attr/textAppearanceLarge"
  16. android:text="Large Text"
  17. android:id="@+id/textView"/>
  18. </LinearLayout>

  2、定义主布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <ListView
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:id="@+id/listView"/>
  11. </LinearLayout>

  3、然后,定义数据源、视图、适配器

  1. private List<HashMap<String,Object>> mData; //M
  2. private ListView listView; //V
  3. private MyAdapter myAdapter; //C

  4、获取数据源

  1. private List<HashMap<String,Object>> getData(){
  2. ArrayList<HashMap<String,Object>> arrayList = new ArrayList<HashMap<String, Object>>();
  3. HashMap<String,Object> hashMap = null;
  4. for(int i=0;i<10;i++){
  5. hashMap = new HashMap<String, Object>();
  6. hashMap.put("index",Integer.toString(i+1));
  7. hashMap.put("img",R.drawable.my);
  8. arrayList.add(hashMap); //添加到数据源中
  9. }
  10. return arrayList;
  11. }

  5、自定义适配器,添加数据源到适配器中

  1. //创建自定义adapter
  2. private class MyAdapter extends BaseAdapter{
  3. private LayoutInflater mlayoutInflater;

  4.       
  5. public MyAdapter(Context context) {
  6. mlayoutInflater = LayoutInflater.from(context); //动态布局映射
  7. }
  8.  
  9. @Override
  10. public int getCount() {
  11. return mData.size();
  12. }
  13.  
  14. @Override
  15. public Object getItem(int position) {
  16. return null;
  17. }
  18.  
  19. @Override
  20. public long getItemId(int position) {
  21. return 0;
  22. }
  23.  
  24. @Override
  25. public View getView(int position, View convertView, ViewGroup parent) {
  26. convertView = mlayoutInflater.inflate(R.layout.listitem, null); // 根据布局文件实例化view
  27. TextView tv = (TextView)convertView.findViewById(R.id.textView);
  28. tv.setText(mData.get(position).get("index").toString());
  29. ImageView img = (ImageView)convertView.findViewById(R.id.imageView);
  30. img.setBackgroundResource((Integer)mData.get(position).get("img"));
  31. return convertView;
  32. }
  33. }

  6、在onCreate函数中实施

  1. listView = (ListView)findViewById(R.id.listView);
  2. //----
  3. mData = getData();
  4. myAdapter = new MyAdapter(this);
  5. listView.setAdapter(myAdapter);

三、总结

  整个实现流程都严格按照MVC的模式去做,首先是自定义自己的元素布局,然后获取数据源,然后重写适配器,加载数据源到适配器中,通过listview显示适配器内容。

以下附上Java代码完整版:

  1. package com.example.ListViewTest;
  2.  
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.os.Bundle;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.BaseAdapter;
  10. import android.widget.ImageView;
  11. import android.widget.ListView;
  12. import android.widget.TextView;
  13.  
  14. import java.util.ArrayList;
  15. import java.util.HashMap;
  16. import java.util.List;
  17.  
  18. public class MyActivity extends Activity {
  19. /**
  20. * Called when the activity is first created.
  21. */
  22. @Override
  23. public void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.main);
  26.  
  27. listView = (ListView)findViewById(R.id.listView);
  28. //----
  29. mData = getData();
  30. myAdapter = new MyAdapter(this);
  31. listView.setAdapter(myAdapter);
  32. }
  33.  
  34. private List<HashMap<String,Object>> mData; //M
  35. private ListView listView; //V
  36. private MyAdapter myAdapter; //C
  37.  
  38. private List<HashMap<String,Object>> getData(){
  39. ArrayList<HashMap<String,Object>> arrayList = new ArrayList<HashMap<String, Object>>();
  40. HashMap<String,Object> hashMap = null;
  41. for(int i=0;i<10;i++){
  42. hashMap = new HashMap<String, Object>();
  43. hashMap.put("index",Integer.toString(i+1));
  44. hashMap.put("img",R.drawable.my);
  45. arrayList.add(hashMap); //添加到数据源中
  46. }
  47. return arrayList;
  48. }
  49.  
  50. //创建自定义adapter
  51. private class MyAdapter extends BaseAdapter{
  52. private LayoutInflater mlayoutInflater;
  53.  
  54. public MyAdapter(Context context) {
  55. mlayoutInflater = LayoutInflater.from(context); //动态布局映射
  56. }
  57.  
  58. @Override
  59. public int getCount() {
  60. return mData.size();
  61. }
  62.  
  63. @Override
  64. public Object getItem(int position) {
  65. return null;
  66. }
  67.  
  68. @Override
  69. public long getItemId(int position) {
  70. return 0;
  71. }
  72.  
  73. @Override
  74. public View getView(int position, View convertView, ViewGroup parent) {
  75. convertView = mlayoutInflater.inflate(R.layout.listitem, null); // 根据布局文件实例化view
  76. TextView tv = (TextView)convertView.findViewById(R.id.textView);
  77. tv.setText(mData.get(position).get("index").toString());
  78. ImageView img = (ImageView)convertView.findViewById(R.id.imageView);
  79. img.setBackgroundResource((Integer)mData.get(position).get("img"));
  80. return convertView;
  81. }
  82. }
  83. }

Android复杂自定义Listview实现的更多相关文章

  1. Android中自定义ListView实现上拉加载更多和下拉刷新

    ListView是Android中一个功能强大而且很常用的控件,在很多App中都有ListView的下拉刷新数据和上拉加载更多这个功能.这里我就简单记录一下实现过程. 实现这个功能的方法不止一个,Gi ...

  2. Android之自定义ListView(一)

    PS:自定义View是Android中高手进阶的路线.因此我也打算一步一步的学习.看了鸿洋和郭霖这两位大牛的博客,决定一步一步的学习,循序渐进. 学习内容: 1.自定义View实现ListView的I ...

  3. Android中自定义ListView无法响应OnItemClickListener中的onItemClick方法问题解决方案

    如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView 的Item能被选中的基础是它能获取Focus,也就是说 ...

  4. 【Android】自定义ListView的Adapter报空指针异常解决方法

    刚刚使用ViewHolder的方法拉取ListView的数据,但是总会报异常.仔细查看代码,都正确. 后来打开adapter类,发现getView的返回值为null. 即return null. 将n ...

  5. Android 自定义ListView

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

  6. [置顶] android 自定义ListView实现动画特效

    通过自定义ListView实现动画特效,被点击元素A向前移,A之前元素往后移动. 重点在于动画的实现: 具体代码如下: package com.open.widget; import java.uti ...

  7. android自定义listview实现圆角

    在项目中我们会经常遇到这种圆角效果,因为直角的看起来确实不那么雅观,可能大家会想到用图片实现,试想上中下要分别做三张图片,这样既会是自己的项目增大也会增加内存使用量,所以使用shape来实现不失为一种 ...

  8. Android中使用ListView绘制自定义表格(2)

    上回再写了<Android中使用ListView绘制自定义表格>后,很多人留言代码不全和没有数据样例.但因为项目原因,没法把源码全部贴上来.近两天,抽空简化了一下,做了一个例子. 效果图如 ...

  9. android之ListView,详细介绍实现步骤,举例,自定义listview适配器

    android之ListView,详细介绍实现步骤,举例,自定义listview适配器 本文来源于www.ifyao.com禁止转载!www.ifyao.com android中如何使用listVie ...

随机推荐

  1. Linux 释放物理内存和虚拟内存

    1.查看内存占用情况 $ free -m -h total used free shared buff/cache available Mem: .7G .0G .9G 385M 780M .0G S ...

  2. 自己整合的SSM框架 maven坐标大全

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  3. 写一个Python的windows服务

    1. 安装pywin32和pyinstaller pip install pywin32 pip install pyinstaller 2.写一个服务Demo # -*- coding: utf-8 ...

  4. BZOJ3994:约数个数和(莫比乌斯反演:求[1,N]*[1,M]的矩阵的因子个数)

    Description  设d(x)为x的约数个数,给定N.M,求   Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. Outpu ...

  5. threejs Object的点击(鼠标)事件(获取点击事件的object)

    objects=[]; raycaster = new THREE.Raycaster(); mouse = new THREE.Vector2(); //监听全局点击事件,通过ray检测选中哪一个o ...

  6. linux自学(一)之vmware虚拟机安装

    之前有研究过linux,后来一段时间没有操作了,现在有点陌生,而且当初也没有记录学习内容.现在想从新开始包括虚拟机安装到部署Javaweb项目,把这之间所需要的全都记录下来,以便后边学习参考使用. 虚 ...

  7. Set集合学习

    Java中的Set主要有:HashSet.TreeSet.LinkedHashSet. 一:HashSet HashSet 是一个没有重复元素的无序集合. HashSet由HashMap实现的,不保证 ...

  8. List集合学习

    Java中常用的List子类主要有:ArrayList.LinkedList.Vector.有序(存储和取出的元素一致),可重复的. 三者比较 1:访问:ArrayList和Vector都实现了Ran ...

  9. python笔记-11 rabbitmq

    一.理解rabbitmq的基本背景 1.理解消息队列 1.1 普通queue 在前面的博客中所提到的队列,此处均称之为普通队列 简述一下普通队列的一些分类及不足 1.1.1 基本Queue:queue ...

  10. vector 介绍

    介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...