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. java ee@ Myeclipse 2015 stable 1.0 完美破解方法

    Myeclipse 2015 stable 1.0 完美破解方法 破解步骤: 使用以前的注册机算号,版本选择Blue即可,后续可解锁Spring高级功能,即Bling的所有功能全部具备 1.1 进入m ...

  2. MySQL命令使用手记

    1.登陆          >mysql -u root -p,root没密码按回车. 2.创建数据库  >create database XXX; 3.创建用户     >inse ...

  3. 从assemblyer Instructure deepth understander C principle

    要彻底搞清楚C语言的原理,就必须深入到指令一层去理解.你写一行C代码,编译器会生成什么样的指令,要做到心中有数;

  4. ASP.NET中的注释 .

    之前只知道<!-- -->可以注释掉html页面中的某些部分,或者添加注释说明.今天又看到<%----%>也能添加注释,于是我不解了,google一下. <!--注释-- ...

  5. elecworks中“插入点”的意思

    elecworks中自建符号时,”插入点“的用法: 插入点的作用是:建好的符号加入符号库后,从库里调用符号到原理图中时“插入点”就是符号的中心点---鼠标光标拖动的点. (插入点即为符号调出 时插入图 ...

  6. [iOS基础控件 - 6.6.1] 展示团购数据代码

      1.主控制器: // // ViewController.m // GroupPurchase // // Created by hellovoidworld on 14/12/3. // Cop ...

  7. Unity3D4.x之AssetBundle学习笔记

    关于AssetBundle AssetBundle可用来将多个资源打包为一个文件,实现动态下载和更新.需要注意的是Unity3D5.x以后对打包方式进行了升级,不用再在依赖关系上伤透脑筋,但是和4.x ...

  8. Spider Studio 数据挖掘集成开发环境

    (最新版本: 2.7.12.1) 传统的多线程蜘蛛程序虽然采集速度快, 但是明明不需要所有内容, 却胡子眉毛一把抓, 将整个网页都下载下来当作一个文本进行处理. 由于网页内容参差不齐, 所以抓取质量常 ...

  9. [置顶] MapReduce 编程之 倒排索引

    本文调试环境: ubuntu 10.04 , hadoop-1.0.2 hadoop装的是伪分布模式,就是只有一个节点,集namenode, datanode, jobtracker, tasktra ...

  10. paxos 实现

    原文地址:http://rdc.taobao.com/blog/cs/?p=162 本文主要介绍zookeeper中zookeeper Server leader的选举,zookeeper在选举lea ...