下面我们将以一个例子来讲述ListView之自定义适配器

首先我们看一下效果图:

【分析】

首先:需要创建一个ListView控件,自定义适配器是为了实现自定义ListView的ListView_Item,所以我们应该在创建一个Item

然后书写自定义适配器,自定义适配器的时候需要继承BaseAdapter,然后实现它的未实现的4个方法,然后在实现自定义适配器的构造方法,其构造方法的参数为山下文对象,数据源,必须实现的4个方法主要是对数据源进行过操作,

然后考虑优化方面,我们使用了ViewHolder Pattern,用它的优点(我们来看一下来自国外网友的看法):

Now let’s see how it works with the ViewHolder pattern.

1.The first time it was loaded, convertView is null. We’ll have to inflate our list item layout, instantiate the ViewHolder, find the TextView via

findViewById·() and assign it to the ViewHolder, and set the ViewHolder as tag of convertView.

2.The second time it was loaded, convertView is not null, good! We don’t have to inflate it again. And here’s the sweet thing, we won’t have to call

findViewById() since we can now access the TextView via its ViewHolder.

3.The following time it was loaded, convertView is definitely not null. The findViewById() is never called again, and that makes our smooth ListView scrolling.

【 附上原文:http://www.javacodegeeks.com/2013/09/android-viewholder-pattern-example.html  】

以下来自国内网友的看法:

ViewHolder将需要缓存的view封装好,convertView的setTag才是将这些缓存起来供下次调用。 当你的listview里布局多样化的时候 viewholder的作用体现明显,效率再一次提高。 View的findViewById()方法也是比较耗时的,因此需要考虑只调用一次,之后就用View.getTag()方法来获得 ViewHolder对象。(小编比较赞同这个)

【附上原文:http://www.xker.com/page/e2014/1217/150764.html

【编码】

首先,我们先看自定义适配器这部分的代码:

package cn.edu.bzu.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView; import org.w3c.dom.Text; import java.util.List; import cn.edu.bzu.entity.Bean;
import cn.edu.bzu.listview_demo.R; /**
* Created by monster on 2015/4/19.
*/
public class MyListViewAdapter extends BaseAdapter {
private LayoutInflater mInflater; //LayoutInflater是用来找layout下xml布局文件,并且实例化
private List<Bean> mlist;
public MyListViewAdapter(Context context,List<Bean> list) {
mInflater=LayoutInflater.from(context); //得到初始化上下文
mlist=list;
}
@Override
public int getCount() {
return mlist.size();
} @Override
public Object getItem(int position) {
return mlist.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
if(convertView==null){
convertView=mInflater.inflate(R.layout.listview_item,null); //将布局转换成视图
holder=new ViewHolder();
holder.mTitle=(TextView)convertView.findViewById(R.id.id_title);
holder.mDesc=(TextView)convertView.findViewById(R.id.id_desc);
holder.mDate=(TextView)convertView.findViewById(R.id.id_time);
holder.mPhone=(TextView)convertView.findViewById(R.id.id_phone);
convertView.setTag(holder);
}else {
//ViewHolder被复用
holder=(ViewHolder)convertView.getTag();
}
holder.mTitle.setText(mlist.get(position).getTitle());
holder.mDesc.setText(mlist.get(position).getDesc());
holder.mPhone.setText(mlist.get(position).getPhone());
holder.mDate.setText(mlist.get(position).getDate());
return convertView;
}
private class ViewHolder{
TextView mTitle;
TextView mDesc;
TextView mDate;
TextView mPhone;
}
}

然后我们看一下MainActivity.java

package cn.edu.bzu.listview_demo;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.ListView; import java.util.ArrayList;
import java.util.List; import cn.edu.bzu.adapter.MyListViewAdapter;
import cn.edu.bzu.entity.Bean; public class MainActivity extends ActionBarActivity {
private ListView listView;
private List<Bean> list;
private MyListViewAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getData();
initView();
} private void initView() {
listView=(ListView)findViewById(R.id.ListView);
listView.setAdapter(adapter);
} private void getData() {
list=new ArrayList<Bean>();
list.add(new Bean("Android新技能1","Android打造万能的ListView和GridView适配器1","2015-04-19","10086"));
list.add(new Bean("Android新技能2","Android打造万能的ListView和GridView适配器2","2015-04-19","10086"));
list.add(new Bean("Android新技能3","Android打造万能的ListView和GridView适配器3","2015-04-19","10086"));
list.add(new Bean("Android新技能4","Android打造万能的ListView和GridView适配器4","2015-04-19","10086"));
adapter=new MyListViewAdapter(MainActivity.this,list);
}
}

--------------------------------------------------------------------------------------------------------------------------------------------

【总结】

创建自定义适配器的步骤:

1.继承BaseAdapter,实现BaseAdapter未实现的方法,包括(getCount(),getItem(),getItemId(),getView())

2.创建含参的构造方法,参数包括(Context ,List集合)

3.创建ViewHolder类,ViewHolder主要包括listView_Item的控件类型

4.书写getView方法,包括实例化控件,控件赋值

【项目托管】

URL:(https://github.com/monsterLin/ListView_Custom-adapter);

--来自Android Stdio编写

细解ListView之自定义适配器的更多相关文章

  1. Android -- ListView(SimpleAdapter) 自定义适配器

    aaarticlea/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA ...

  2. ListView使用自定义适配器的情况下实现适配器的文本和图标控件点击事件执行Activity界面中的方法

    ListView使用的是自定义适配器,列表项的布局文件中含有文本和图标,实现文本区域和图标区域的点击事件. 实现思路:在自定义适配器MyArrayAdapter 类型中自定义接口和接口方法,分别设置文 ...

  3. ListView使用自定义适配器的情况下实现适配器的控件点击事件执行Activity界面中的方法

    如果ListView使用的是自定义的适配器,比如MyArrayAdapter extends ArrayAdapter<String> 那么,如何实现适配器中的点击事件执行activity ...

  4. 安卓开发_浅谈ListView(自定义适配器)

    ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果 有这样一个Demo ...

  5. ListView的自定义适配器及其优化(listView序号混乱问题的处理)

    ListView是最常使用的android组件之一,关于listView的优化问题刚刚了解了一些,在这里做出总结. PS:如果想让ListView中的item根据数据内容显示item的大小,需要在it ...

  6. ListView(下)自定义适配器

    (一) 1.效果图 2.activity_main.xml <?xml version="1.0" encoding="utf-8"?> <L ...

  7. (转)Android之自定义适配器

    ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果. 有这样一个Demo ...

  8. BaseAdapter自定义适配器——思路详解

    BaseAdapter自定义适配器——思路详解 引言: Adapter用来把数据绑定到扩展了AdapterView类的视图组.系统自带了几个原生的Adapter. 由于原生的Adapter视图功能太少 ...

  9. 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

    1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and ...

随机推荐

  1. React问题总结与归纳

    欢迎大家指导与讨论 : ) [持续更新]本文主要记录笔者在学习中遇到的问题,并作出相应总结.有错误的地方希望各位能够指出. 一.在es6中getInitialState( 摘要:  construct ...

  2. FFmpeg中HLS文件解析源码

    不少人都在找FFmpeg中是否有hls(m3u8)解析的源码,其实是有的.就是ffmpeg/libavformat/hlsproto.c,它依赖的文件也在那个目录中. 如果要是单纯想解析HLS的话,建 ...

  3. silverlight 4 tools for vs2010无法在vs2010 SP1上安装的解决办法

    环境:英文版vs2010 sp1 + vs2013 RC 90天体验版 原来可以正常做silverilght 4 项目开发,今天因为vs2013 RC过了90天体验期,卸载时顺带把Silverlihg ...

  4. 纯手工搭建JSF开发环境(JSF2.2+maven+weblogic 12c/jboss EAP 6.1+)

    前言: JSF 2.X因为种种原因(我个人觉得主要是因为推出太晚),再加上EJB2之前的设计过于复杂,引起很多开发人员对官方解决方案的反感,即使EJB3后来做了大量改进,国内也很少有人对EJB3感兴趣 ...

  5. Python3.1-标准库之Numpy

    这系列用来介绍Python的标准库的支持Numpy部分.资料来自http://wiki.scipy.org/Tentative_NumPy_Tutorial,页面有许多链接,这里是直接翻译,所以会无法 ...

  6. 学习SQLite之路(三)

    20160616更新 参考: http://www.runoob.com/sqlite/sqlite-tutorial.html 1. SQLite  PRAGMA:可以用在 SQLite 环境内控制 ...

  7. SQL Server Data Tools – Business Intelligence for Visual Studio 2012安装时提示“The CPU architecture....”的解决方法

    SQL Server Data Tools – Business Intelligence for Visual Studio 2012,一个很强大的工具,下载地址:http://www.micros ...

  8. TextBoxFor控件的扩展---Bootstrap在mvc上的应用

    TextBoxFor控件的问题: 1:自带了样式,再用bootstrap样式会有冲突. 2:要加水印,js事件,限制输入长度比较麻烦. 因此需要对textboxfor控件进行扩展. 目标: 1:能使用 ...

  9. [转]Win2003打不开https的问题

    转自:http://ljl-xyf.iteye.com/blog/2269834 碰到客户做问题是能打开https://www.baidu.com 这个网页 打不开 https://sha256.al ...

  10. C#迭代器

    迭代器概述 迭代器是可以返回相同类型的值的有序序列的一段代码. 迭代器可用作方法.运算符或 get 访问器的代码体. 迭代器代码使用 yield return 语句依次返回每个元素.yield bre ...