android的ListView实现
2016-03-23 16:00
477 查看
列表的显示需要三个元素:
(1).ListVeiw 用来展示列表的View。
(2).适配器 用来把数据映射到ListView上的中介。
(3).数据 具体的将被映射的字符串,图片,或者基本组件。
1、ArrayAdapter适配器实现ListView,最为简单,只能展示一行字。可以选择系统布局来实现单选和多选列表。
2、SimpleAdapter 构造函数前面3个参数和ArrayAdapter是一样的,最后两个参数:一个包含数据库的列的String型数组,一个包含布局文件中对应组件id的int型数组。其作用是自动的将String型数组所表示的每一列数据映射到布局文件对应id的组件上(SimpleCursorAdapter
也是如此,SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来)。
ListView项布局:
3、继承BaseAdapter的自定义Adapter实现ListView。
主布局如下:
ListView的项布局如下:(图片,然后是上下布局的title和content,最后一个button按钮)
listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的vlist2.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示。
在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了
focusable=“false”
总结一下:
1、ListView宽高设置为match_parent,避免内容变化导致ListVIew重新渲染;
2、使用convertView减少对象的创建;
3、使用ViewHolder减少对象的查找;每次查找都会去遍历id的xml树,这也是为什么布局文件不要嵌套太多层的原因---查找对象会很费时间。
(1).ListVeiw 用来展示列表的View。
(2).适配器 用来把数据映射到ListView上的中介。
(3).数据 具体的将被映射的字符串,图片,或者基本组件。
1、ArrayAdapter适配器实现ListView,最为简单,只能展示一行字。可以选择系统布局来实现单选和多选列表。
package com.example.dhasa.studydemo; import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.ArrayList; import java.util.List; /** * @author dhasa * 数据源为一个list,使用系统提供的布局 */ public class Main2Activity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ListView lv = new ListView(this); lv.setAdapter(new ArrayAdapter(this,android.R.layout.simple_expandable_list_item_1,getData())); setContentView(lv); } private List<String> getData(){ List<String> data = new ArrayList(); data.add("android"); data.add("web"); data.add("js"); data.add("mysql"); return data; } }
2、SimpleAdapter 构造函数前面3个参数和ArrayAdapter是一样的,最后两个参数:一个包含数据库的列的String型数组,一个包含布局文件中对应组件id的int型数组。其作用是自动的将String型数组所表示的每一列数据映射到布局文件对应id的组件上(SimpleCursorAdapter
也是如此,SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来)。
ListView项布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/iv2" android:layout_width="50dp" android:layout_height="50dp" android:padding="5dp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:id="@+id/title2"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp" android:id="@+id/content2"/> </LinearLayout> </LinearLayout>activity代码:
package com.example.dhasa.studydemo; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; import android.widget.SimpleAdapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author dhasa * @param /上下文、list数据、项布局、string类型的key数组、相应填充的控件id */ public class MainActivity extends Activity { private ListView lv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv); lv.setAdapter(new SimpleAdapter(this,getData(),R.layout.list_item2, new String[]{"title","content","img"}, new int[]{R.id.title2,R.id.content2,R.id.iv2})); } private List<Map<String,Object>> getData(){ List<Map<String,Object>> list = new ArrayList(); Map<String,Object> map1 = new HashMap(); map1.put("title","android"); map1.put("content","华为小米"); map1.put("img",R.drawable.xiaobendan); list.add(map1); Map<String,Object> map2 = new HashMap(); map2.put("title","web"); map2.put("content","youtube"); map2.put("img",R.drawable.aoteman); list.add(map2); Map<String,Object> map3 = new HashMap(); map3.put("title","mountsData"); map3.put("content","大数据"); map3.put("img",R.drawable.kakaxi); list.add(map3); return list; } }
3、继承BaseAdapter的自定义Adapter实现ListView。
主布局如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" tools:context="com.example.dhasa.studydemo.MainActivity"> <ListView android:id="@+id/lv01" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> </RelativeLayout>添加了一个ListView,宽和高注意为match_parent。
ListView的项布局如下:(图片,然后是上下布局的title和content,最后一个button按钮)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/img" android:layout_width="50dp" android:layout_height="50dp" android:layout_margin="5dp"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:text="11111"/> <TextView android:id="@+id/content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="13sp" android:text="22222"/> </LinearLayout> <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/view_btn" android:layout_gravity="right"/> </LinearLayout>activity源码:
package com.example.dhasa.studydemo; 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.Button; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MainActivity extends Activity { private ListView lv; private List<Map<String, Object>> mData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);//加载主布局 lv = (ListView) findViewById(R.id.lv01);//找到listview实例 mData = getData();//获取数据 lv.setAdapter(new MyAdapter(getApplicationContext()));//为listview绑定适配器 } class MyAdapter extends BaseAdapter { private LayoutInflater mInflater; public MyAdapter(Context context) { this.mInflater = LayoutInflater.from(context); } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup viewGroup) { ViewHolder vh; if (convertView == null) { vh = new ViewHolder(); convertView = mInflater.inflate(R.layout.list_item, null); vh.btn = (Button) convertView.findViewById(R.id.btn); vh.content = (TextView) convertView.findViewById(R.id.content); vh.title = (TextView) convertView.findViewById(R.id.title); vh.iv = (ImageView) convertView.findViewById(R.id.img); convertView.setTag(vh); }else{ vh = (ViewHolder) convertView.getTag(); } vh.iv.setBackgroundResource((Integer) mData.get(position).get("img")); vh.title.setText((String) mData.get(position).get("title")); vh.content.setText((String)mData.get(position).get("info")); vh.btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(getApplicationContext(), "hello list", Toast.LENGTH_SHORT).show(); } }); return convertView; } } public final class ViewHolder { ImageView iv; TextView title; TextView content; Button btn; } private List<Map<String, Object>> getData() { List<Map<String, Object>> list = new ArrayList(); Map<String, Object> mp1 = new HashMap(); mp1.put("title", "android"); mp1.put("info", "安卓"); mp1.put("img", R.mipmap.ic_launcher); list.add(mp1); Map<String, Object> mp2 = new HashMap(); mp2.put("title", "front-end"); mp2.put("info", "前端"); mp2.put("img", R.drawable.kakaxi); list.add(mp2); Map<String, Object> mp3 = new HashMap(); mp3.put("title", "web-background"); mp3.put("info", "网站后台"); mp3.put("img", R.drawable.xiaobendan); list.add(mp3); return list; } }引用网友的一段话:
listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的vlist2.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示。
在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了
focusable=“false”
总结一下:
1、ListView宽高设置为match_parent,避免内容变化导致ListVIew重新渲染;
2、使用convertView减少对象的创建;
3、使用ViewHolder减少对象的查找;每次查找都会去遍历id的xml树,这也是为什么布局文件不要嵌套太多层的原因---查找对象会很费时间。
相关文章推荐
- android基础---->传感器的使用
- Canvas绘制以及使用第三方字体(多媒体学习基础)
- Android图像处理之Canvas
- 【技术分享】Android应用安全开发之浅谈加密算法的坑
- 打开android studio 时遇到卡顿,任务管理器里有N多个aapt.exe进程情况的解决
- Android_Module用法_和_如何制作自己的Library开源库
- Android应用中使用ViewPager和ViewPager指示器来制作Tab标签
- 解决Android调用系统相机拍照后相片无法在相册中显示问题
- Android的Looper类使用详解
- android 文件上传、下载
- android demo自动开启WiFi
- 如何在mac下安装android sdk
- Android 自定义属性,系统控件扩展
- Android ListView常用小技巧汇总
- Android_Handler详解(一)
- Android 最火的快速开发框架XUtils
- Android实战技巧:深入解析AsyncTask
- 图片压缩小例子
- Android中 Handler使用全解
- Ubuntu下开发Android 环境变量设置