Android复杂自定义Listview实现
在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实现的更多相关文章
- Android中自定义ListView实现上拉加载更多和下拉刷新
ListView是Android中一个功能强大而且很常用的控件,在很多App中都有ListView的下拉刷新数据和上拉加载更多这个功能.这里我就简单记录一下实现过程. 实现这个功能的方法不止一个,Gi ...
- Android之自定义ListView(一)
PS:自定义View是Android中高手进阶的路线.因此我也打算一步一步的学习.看了鸿洋和郭霖这两位大牛的博客,决定一步一步的学习,循序渐进. 学习内容: 1.自定义View实现ListView的I ...
- Android中自定义ListView无法响应OnItemClickListener中的onItemClick方法问题解决方案
如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView 的Item能被选中的基础是它能获取Focus,也就是说 ...
- 【Android】自定义ListView的Adapter报空指针异常解决方法
刚刚使用ViewHolder的方法拉取ListView的数据,但是总会报异常.仔细查看代码,都正确. 后来打开adapter类,发现getView的返回值为null. 即return null. 将n ...
- Android 自定义ListView
本文讲实现一个自定义列表的Android程序,程序将实现一个使用自定义的适配器(Adapter)绑定 数据,通过contextView.setTag绑定数据有按钮的ListView. 系统显示列表(L ...
- [置顶] android 自定义ListView实现动画特效
通过自定义ListView实现动画特效,被点击元素A向前移,A之前元素往后移动. 重点在于动画的实现: 具体代码如下: package com.open.widget; import java.uti ...
- android自定义listview实现圆角
在项目中我们会经常遇到这种圆角效果,因为直角的看起来确实不那么雅观,可能大家会想到用图片实现,试想上中下要分别做三张图片,这样既会是自己的项目增大也会增加内存使用量,所以使用shape来实现不失为一种 ...
- Android中使用ListView绘制自定义表格(2)
上回再写了<Android中使用ListView绘制自定义表格>后,很多人留言代码不全和没有数据样例.但因为项目原因,没法把源码全部贴上来.近两天,抽空简化了一下,做了一个例子. 效果图如 ...
- android之ListView,详细介绍实现步骤,举例,自定义listview适配器
android之ListView,详细介绍实现步骤,举例,自定义listview适配器 本文来源于www.ifyao.com禁止转载!www.ifyao.com android中如何使用listVie ...
随机推荐
- Linux 释放物理内存和虚拟内存
1.查看内存占用情况 $ free -m -h total used free shared buff/cache available Mem: .7G .0G .9G 385M 780M .0G S ...
- 自己整合的SSM框架 maven坐标大全
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- 写一个Python的windows服务
1. 安装pywin32和pyinstaller pip install pywin32 pip install pyinstaller 2.写一个服务Demo # -*- coding: utf-8 ...
- BZOJ3994:约数个数和(莫比乌斯反演:求[1,N]*[1,M]的矩阵的因子个数)
Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. Outpu ...
- threejs Object的点击(鼠标)事件(获取点击事件的object)
objects=[]; raycaster = new THREE.Raycaster(); mouse = new THREE.Vector2(); //监听全局点击事件,通过ray检测选中哪一个o ...
- linux自学(一)之vmware虚拟机安装
之前有研究过linux,后来一段时间没有操作了,现在有点陌生,而且当初也没有记录学习内容.现在想从新开始包括虚拟机安装到部署Javaweb项目,把这之间所需要的全都记录下来,以便后边学习参考使用. 虚 ...
- Set集合学习
Java中的Set主要有:HashSet.TreeSet.LinkedHashSet. 一:HashSet HashSet 是一个没有重复元素的无序集合. HashSet由HashMap实现的,不保证 ...
- List集合学习
Java中常用的List子类主要有:ArrayList.LinkedList.Vector.有序(存储和取出的元素一致),可重复的. 三者比较 1:访问:ArrayList和Vector都实现了Ran ...
- python笔记-11 rabbitmq
一.理解rabbitmq的基本背景 1.理解消息队列 1.1 普通queue 在前面的博客中所提到的队列,此处均称之为普通队列 简述一下普通队列的一些分类及不足 1.1.1 基本Queue:queue ...
- vector 介绍
介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...