在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. css3实现对radio和checkbox的美化

    一,如何隐藏小程序中的很粗的滚动条,实现页面的美化?   tit: 在开发小程序的过程中,无论是横向或者纵向当产生滚动条时,系统默认的滚动条会很粗,效果展示十分难看,我们可以通过设置如下wxss代码实 ...

  2. day3 文件系统 内核模块 ctags

    nfs网络文件系统 smb   修改配置文件  sudo  vim /etc/samba/smb.conf    重启服务   /etc/init.d/samba restart 自制小的文件系统 1 ...

  3. PHP 关于empty和isset对于参数的判断结果

    <?php class test{} $a1 = null; $a2 = ""; //$a3 = $a4 = 0; $a5 = '0'; $a6 = false; $a7 = ...

  4. java 输入输出流 关于InputStream 和 OutputSteam 实现文本一行一行读入和 文本一行一行输出

    对  byte 有了新的认知:byte表示一个字节 因此他可以表示成 一个 数字: 一个数字可以映射成一个字符:InputStream 中的 read() 函数  的意思是读入一个整数,读入一个整数的 ...

  5. 向requestAnimationFrame的回调函数中传递参数

    其实跟setTimeout类似,我们知道传参传的是一个函数,那么我们是不是可以用一个匿名函数来包裹这个函数的执行呢function fn(fc){ console.log('fc:',fc) fc++ ...

  6. ubuntu中安装iso文件

    [font=微软雅黑]小施今天写一篇教程来教大家如何在Ubuntu中使用虚拟光驱. 在中使用是很简单的.可是很多新手却不会  前提:你所在的用户必须拥有root权限(终端中需要用到root权限).一个 ...

  7. ecmall页面空白解决方案(转)

    页面空白解决方案: ------------------------------------------------------------------------------------------ ...

  8. Oracle分组函数实例

    分组函数也叫聚合函数.如果在查询只想要查分组函数,那么跟平时的查询语句并无不同: SQL ,,,,) ; SUM(T.PRIZENUM) AVG(T.PRIZENUM) --------------- ...

  9. 【转载】探寻C++最快的读取文件的方案

    原文地址:https://www.byvoid.com/blog/fast-readfile/ 在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式.相信几乎所有的C++学习者 ...

  10. Data_Structure02-线性表

    一.PTA实验作业 本周要求挑3道题目写设计思路.调试过程.设计思路用伪代码描述. 1.顺序表选择一题(6-2,6-3,7-1选一题),代码必须用顺序结构抽象数据类型封装 2.单链表选择一题(6-1不 ...