在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. moment时间转换插件

    在vue中的使用: import moment = from “moment” Vue.prototype.$moment = moment; 获取时间戳 : var res = this.$mome ...

  2. AspectJ语法

    AspectJ语法 看了很多AOP的文章了,AOP这两年发展的很慢,没有什么新意,现在到处都是SOA,SCA了,不过研究了一下,觉得还是很有帮助的.尤其是增加系统的契约性和模块的独立性来说,很有帮助. ...

  3. RankNet

    RankNet 论文的笔记:Learning to rank using gradient descent. 模型 特征 \(\mathbf x_i \in \mathbb R^d\) 模型函数:\( ...

  4. vc 实现一个 http Server

    实现 http 的协议解析 以及封装 , 对应不同的访问地址, 调用绑定的处理程序 , #include "stdafx.h" #include "lyocomm\web ...

  5. usb udev

    [root@localhost ~] # udevadm monitor monitor will print the received events for: UDEV - the event wh ...

  6. WebStorm的主题与设置

    1.  Webstorm主题风格选择 2.  Webstorm字体字号配置 3.  Webstorm快捷键的查找 4.  Webstorm插件的安装

  7. java 乐观锁CAS

    乐观锁是一种思想,本身代码里并没有lock或synchronized关键字进行修饰.而是采用一种version. 即先从数据库中查询一条记录得到version值,在更新这条记录时在where条件中对这 ...

  8. docker could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network

    原因: 无法进行网络分配了 解决方法: // 所有的网络 docker network ls // 删除不用的,腾出多余的 docker network rm <networkname> ...

  9. vue数据已渲染成 但还是报错 变量 undefined

    问题:页面上的数据已渲染出来,但是控制台还是报错变量未undefined,主要是当页面加载完成后,数据并未加载完,所以会报次错误. 解决办法:在数据渲染的主节点(最外层的div)添加 v-if=“da ...

  10. PAT1055___排序神题

    题目意思比较简单,按财富,年龄,姓名来排序 看似挺普通的,但被坑了20多次TLE 首先排序只要一次,就是按题目规定的进行排序 然后在查询的时候,不是从头扫到尾看是否符合年龄的限制,而是记录这个年龄组在 ...