ListView、GridView等等非常多的东西都需要适配器。而如果开发一个app每一个listview都有写一个Adapter的话,那还怎么愉快的玩游戏。。

什么是ViewHolider以及的用法和为什么要用?

这位博主写的非常好。

http://www.cnblogs.com/lichenwei/p/4085107.html

所谓的万能适配器,无非是将适配器的重复代码抽取出来进行封装。不同功能的代码则留写一个方法留给用户复写,则每个listview的适配器就只变成几句话就够了。

这是一般适配器的代码:

private class MyAdapter extends BaseAdapter
{ private Context mcontext=null;
private LayoutInflater inflater; public MyAdapter(Context c)
{
this.mcontext=c;
this.inflater=LayoutInflater.from(c);//from告诉系统从哪里获得布局填充器
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mListTitle.length;
} @Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return arg0;
} @Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
} @Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
ViewHolder viewholder =null;
if (arg1==null)
{
viewholder=new ViewHolder();
arg1=inflater.inflate(R.layout.iconlist, arg2, false);
viewholder.iv=(ImageView)arg1.findViewById(R.id.imageview);
viewholder.title=(TextView)arg1.findViewById(R.id.title);
viewholder.text=(TextView)arg1.findViewById(R.id.text);
arg1.setTag(viewholder);
}
else
{
viewholder=(ViewHolder)arg1.getTag();
}
viewholder.iv.setImageResource(R.drawable.icon1);
viewholder.title.setText(mListTitle[arg0]);
viewholder.text.setText(mListStr[arg0]);
return arg1;
} }
private class ViewHolder
{
private ImageView iv=null;
private TextView title=null;
private TextView text=null;
}

首先我们先对ViewHolder进行封装:

1、ViewHolder将xml文件转换成convertview,并将转换后的view返回

2、要设置标签

3、判断convertview是否为空,空的话重新new创建,不为空的话getTag();

代码:

 package com.example.list_view;
import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; public class easyViewHolder { private SparseArray<View> sparseArray;
private Context context;
private int LayoutId;
private View convertview;
public easyViewHolder(Context mcontext,View mconvertview,int LayoutId,ViewGroup parent)
{
this.context=mcontext;
this.sparseArray=new SparseArray<View>();
this.convertview=LayoutInflater.from(mcontext).inflate(LayoutId, parent, false);
convertview.setTag(this);
}
public static easyViewHolder get(Context context,View convertview,int LayoutId,ViewGroup parent)
{
if (convertview==null)
{
return new easyViewHolder(context, convertview, LayoutId, parent);
} // 特别需要注意的一点,由于ListView的复用,比如屏幕只显示5个Item,那么当下拉到第6个时会复用第1个的Item,所以这边需要更新position
return (easyViewHolder)convertview.getTag(); }
public <T extends View> T getView(int viewId)//通过id找到组件
{
View view = sparseArray.get(viewId);
if (view==null)
{
view=(View)this.convertview.findViewById(viewId);
sparseArray.put(viewId, view);
}
return (T)view; }
public View getConvertView()
{
return this.convertview;
}
}

再封装一个适配器:

声明一个抽象类

1、保留不变的方法

2、修改getview()

3、写一个需要重写函数用来给用户传值。

 package com.example.list_view;

 import java.util.ArrayList;
import java.util.List; import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter; public abstract class easyAdapter<T> extends BaseAdapter { private Context context;
private ArrayList<T> data;
private LayoutInflater inflater;
private int LayoutId;
easyViewHolder easyholder;
public easyAdapter( Context context,ArrayList<T> data,int layoutid)
{
this.context=context;
this.data=data;
inflater.from(context);
this.LayoutId=layoutid;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.size();
} @Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return arg0;
} @Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
} @Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
final easyViewHolder easyholder=getHolder(context, arg1, LayoutId, arg2);
setConverView(easyholder,data.get(arg0));//需要用户复写传值
return easyholder.getConvertView();
}
public abstract void setConverView(easyViewHolder easyViewHolder, T t);
public static easyViewHolder getHolder(Context context,View convertview,int LayoutId,ViewGroup parent)
{
return easyViewHolder.get(context, convertview, LayoutId, parent);
}
}

以上的两个类除了添加新功能不用在对其改变。

接下来我们就可以以最少的代码完成适配器:

 package com.example.list_view;

 import java.util.ArrayList;
import java.util.List; import android.content.Context;
import android.widget.ImageView;
import android.widget.TextView; public class MyAdapter extends easyAdapter<User> { public MyAdapter(Context context, ArrayList<User> data, int layoutId) {
super(context, data, layoutId);
// TODO Auto-generated constructor stub
}
//只需在下面函数传入你所需要的值
public void setConverView(easyViewHolder myViewHolder, User t) {
// TODO Auto-generated method stub ((ImageView)myViewHolder.getView(R.id.imageview)).setImageResource(R.drawable.icon1);
((TextView)myViewHolder.getView(R.id.title)).setText(t.getTitle());
((TextView)myViewHolder.getView(R.id.text)).setText(t.getText()); } }

MainActivity的代码:

for (int i=0;i<10;i++)
{
User user=new User();
user.setIv(R.drawable.icon1);
user.setTitle("用户"+i);
user.setText("1000"+i);
list.add(user);
}
MyAdapter adapter=new MyAdapter(MainActivity.this, list, R.layout.iconlist);
list1.setAdapter(adapter);

只是单纯传入你这个listview所需要的数据源,以及传入listview的布局,便可完成各式各样的listview。

Android开发之万能适配器的更多相关文章

  1. Android开发进阶 -- 通用适配器 CommonAdapter

    在Android开发中,我们经常会用到ListView 这个组件,为了将ListView 的内容展示出来,我们会去实现一个Adapter来适配,将Layout中的布局以列表的形式展现到组件中.     ...

  2. android中的万能适配器BaseAdapter的总结

    有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮.添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上.但是事实并非这样,因为按钮是 ...

  3. Android 开发笔记___spinner__适配器基础_arrayadapter

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...

  4. Android进阶笔记10:Android 万能适配器

    1. Android 万能适配器      项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都 ...

  5. 安卓开发笔记——打造万能适配器(Adapter)

    为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...

  6. Android进阶笔记09:Android 万能适配器

    1. Android 万能适配器      项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都 ...

  7. android 手写万能adapter适配器

    android开发中,我们离不开adapter,每个项目都有很多地方需要adapter,那么我们如何让自己少写adapter代码呢?那就是封装adapter,让我们的adapter成为万能的adapt ...

  8. 打造android偷懒神器———ListView的万能适配器

    如果你去做任何一个项目,我相信你都会跟我有一样的经历,最最普遍的就是列表显示ListView,当然,写N个自定义的适配器也是情理之中.虽说程序员本身就是搬砖,做这些枯燥无味的重复的事情也是理所当然,但 ...

  9. 打造android偷懒神器———RecyclerView的万能适配器

    转载请注明出处谢谢:http://www.cnblogs.com/liushilin/p/5720926.html 很不好意思让大家久等了,本来昨天就应该写这个的,无奈公司昨天任务比较紧,所以没能按时 ...

随机推荐

  1. python 定义函数

    在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_abs函数 ...

  2. Modbus Poll master-slave测试 Dtech USB转485(worldsing 笔记)

    1,简介 网站地址:http://www.modbustools.com/ 该网站提供了几个软件工具,可以运行于windows 2000/XP/Vista/7环境下,用来测试和仿真Modebus设备. ...

  3. Linux web工程部署远程必备软件安装

    一.序 最近在将程序往linux上面部署,特此记录下部署步骤,待以后参考. web工程部署必备软件为:JDK.tomcat.数据库软件(oracle或mysql),远程监控.上传下载必备软件:VNC. ...

  4. web.xml(spring/spring mvc/hibernate)

    <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" ...

  5. hdu 5480 Conturbatio 线段树 单点更新,区间查询最小值

    Conturbatio Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=54 ...

  6. 戴尔笔记本win8.1+UEFI下安装Ubuntu14.04过程记录

    瞎扯:笔记本刚买不久就想装ubuntu来着,但结果发现BIOS启动方式为UEFI,网上一搜索发现跟曾经的双系统安装方法不一样,看详细教程感觉相当复杂,并且也有点操心折腾跪了这新本本所以一直没有动手.但 ...

  7. Android模拟器操作快捷键

    你可以通过模拟器的启动选项和控制台命令来控制模拟环境的行为和特性.一旦模拟器启动,你就可以通过键盘和鼠标来“按” 模拟器的按键,从而操作模拟器.下面的表格总结了模拟器按键可键盘按键之间的映射关系. 模 ...

  8. ios开发——实用技术OC篇&地图与定位

    地图与定位 11.1 iOS定位服务 11.2 iOS地图 11.3 Web地图 1 iOS定位服务 iOS中有三个定位服务组件: Wifi定位,通过查询一个Wifi路由器的地理位置的信息.比较省电, ...

  9. android133 360 06 一键锁频,清楚数据

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...

  10. php测试代码工具类

      <?php error_reporting (E_ALL); ini_set ('display_errors', 'on'); ?> <meta http-equiv=&quo ...