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 ...
随机推荐
- learn go anonymous function
package main // 参考文档: // https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.8.md im ...
- ubuntu安装依赖:0.8.1-1ubuntu4.4 正要被安装以及vm nested解决方法
刚才在ubuntu10.04虚拟机上安装kvm,提示0.8.1-1ubuntu4.4 正要被安装,查了一下,有一种解决方法: 进入“系统->系统管理->更新管理器->设置”,在弹出的 ...
- Create A .NET Core Development Environment Using Visual Studio Code
https://www.c-sharpcorner.com/article/create-a-net-core-development-environment-using-visual-studio- ...
- Prism patterns & practices Developer Center
Prism https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff648465(v=pandp.10) Prism provides ...
- 接口结构+一个selenium例子
大家今天可以先建一个项目目录,明天我们在码代码: 我看好多朋友都在看selenium方面的东西,在这里给大家一个和讯网自动发文章的selenium代码,有兴趣的朋友可以试试,船长已亲测可用,不明白的地 ...
- LG3960 列队
题意 传送门 分析 参照博客 树状数组+离线处理即可. 利用树状数组下标本质即可\(O(\log n)\)求第k大. 代码 #include<iostream> #include<c ...
- osquery简单试用
备注: osquery facebook 开源的将操作系统指标转换为sql 查询,方便好用,很适合devops 性能分析,系统监控 1. 安装 参考 https://osquery.io/downl ...
- nginx 缓存处理
核心指令 proxy_cache_path /data/nginx/cache/one levels=1:2 keys_zone=one:10m max_size=10g; proxy_cache ...
- geohash 精度
关于地图的距离. $list1=Db::name('museum')->where('id','in',$user['gz'])->order('ACOS(SIN(('.$lat.' * ...
- ORACLE 12C RMAN 功能增强
在ORACLE 12C中对rman的功能有了不少增强,在以前的文章中写过RMAN RECOVER TABLE功能,这里另外补充rman增强的两个小功能(sql语句和数据文件分割)数据库版本 SQL&g ...