在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

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"> <ImageView
android:layout_width="fill_parent"
android:layout_height="100dp"
android:id="@+id/imageView"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="@+id/textView"/>
</LinearLayout>

  2、定义主布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView"/>
</LinearLayout>

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

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

  4、获取数据源

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

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

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

      
public MyAdapter(Context context) {
mlayoutInflater = LayoutInflater.from(context); //动态布局映射
} @Override
public int getCount() {
return mData.size();
} @Override
public Object getItem(int position) {
return null;
} @Override
public long getItemId(int position) {
return 0;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = mlayoutInflater.inflate(R.layout.listitem, null); // 根据布局文件实例化view
TextView tv = (TextView)convertView.findViewById(R.id.textView);
tv.setText(mData.get(position).get("index").toString());
ImageView img = (ImageView)convertView.findViewById(R.id.imageView);
img.setBackgroundResource((Integer)mData.get(position).get("img"));
return convertView;
}
}

  6、在onCreate函数中实施

        listView = (ListView)findViewById(R.id.listView);
//----
mData = getData();
myAdapter = new MyAdapter(this);
listView.setAdapter(myAdapter);

三、总结

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

以下附上Java代码完整版:

package com.example.ListViewTest;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; public class MyActivity extends Activity {
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); listView = (ListView)findViewById(R.id.listView);
//----
mData = getData();
myAdapter = new MyAdapter(this);
listView.setAdapter(myAdapter);
} private List<HashMap<String,Object>> mData; //M
private ListView listView; //V
private MyAdapter myAdapter; //C private List<HashMap<String,Object>> getData(){
ArrayList<HashMap<String,Object>> arrayList = new ArrayList<HashMap<String, Object>>();
HashMap<String,Object> hashMap = null;
for(int i=0;i<10;i++){
hashMap = new HashMap<String, Object>();
hashMap.put("index",Integer.toString(i+1));
hashMap.put("img",R.drawable.my);
arrayList.add(hashMap); //添加到数据源中
}
return arrayList;
} //创建自定义adapter
private class MyAdapter extends BaseAdapter{
private LayoutInflater mlayoutInflater; public MyAdapter(Context context) {
mlayoutInflater = LayoutInflater.from(context); //动态布局映射
} @Override
public int getCount() {
return mData.size();
} @Override
public Object getItem(int position) {
return null;
} @Override
public long getItemId(int position) {
return 0;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = mlayoutInflater.inflate(R.layout.listitem, null); // 根据布局文件实例化view
TextView tv = (TextView)convertView.findViewById(R.id.textView);
tv.setText(mData.get(position).get("index").toString());
ImageView img = (ImageView)convertView.findViewById(R.id.imageView);
img.setBackgroundResource((Integer)mData.get(position).get("img"));
return convertView;
}
}
}

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 centos 安装opencv

    系统:Centos 6.5 最后版本 OpenCV: 2.4.9 1.安装依赖包(很重要) yum install cmake gcc gcc-c++ gtk+-devel gimp-devel gi ...

  2. 【机器学习】集成学习之sklearn中的xgboost基本用法

    原创博文,转载请注明出处!本文代码的github地址    博客索引地址 1.数据集 数据集使用sklearn自带的手写数字识别数据集mnist,通过函数datasets导入.mnist共1797个样 ...

  3. MySQL 百万级分页优化(Mysql千万级快速分页)

    以下分享一点我的经验 一般刚开始学SQL的时候,会这样写 : SELECT * FROM table ORDER BY id LIMIT 1000, 10; 但在数据达到百万级的时候,这样写会慢死 : ...

  4. 在线编辑器KindEditor的使用

    1.官网下载:点击进入 2.解压后目录说明 ├── asp asp示例 ├── asp.net asp.net示例 ├── attached 空文件夹,放置关联文件attached ├── examp ...

  5. matplotlib ----- 颜色, 标记样式

    颜色: 蓝色 - 'b' 绿色 - 'g' 红色 - 'r' 青色 - 'c' 品红 - 'm' 黄色 - 'y' 黑色 - 'k' 白色 - 'w' 线: 直线 - '-' 虚线 - '--' 点线 ...

  6. asciidoctor 安装试用

    备注:    asciidoctor 是asciidoc 的增强,使用简单,模板比较丰富,对于持续集成方面的开发也是一个不错的工具   1. 安装 a. 环境准备 MRI Ruby 1.8.7, 1. ...

  7. container-diff 谷歌开源镜像分析工具使用

    1. 安装 curl -LO https://storage.googleapis.com/container-diff/latest/container-diff-linux-amd64 & ...

  8. Thumbnailator 图像处理

    Create a thumbnail from an image file Thumbnails.of(new File("original.jpg")) .size(160, 1 ...

  9. 【Oracle】OGG单向复制配置

    实验环境: 源端: Ip:192.168.40.10 DataBase:Oracle 11.2.0.1.0 ORCL OS:OEL5.6 OGG:fbo_ggs_Linux_x86_ora11g_32 ...

  10. 什么是Spark(四)集群

    Driver,主要的职责是生成DAG以及生成物理执行计划(Physical Execution Plan):Application,Job以及Stage都是在这个组建中生成的: ClusterMast ...