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. 如何写出性能好的sql

    开发人员是很少注意SQL对数据库性能影响的重要性的,大多程序员都会认为SQL是比较简单的,需要的时候查查手册就可以了,很少有深究的. 这样的观念对大型系统的开发是致命的,需要纠正这样的观念. 造成这样 ...

  2. EDM

    今天,夏令营需要发推广EDM. 之前的edm都是文字版, 今天摸索了一下,简单写了些码, 效果还不错. 演示:http://baike.baidu.com/cms/s/bkcampus/summerc ...

  3. Theme使用的几点注意事项

    Theme.Holo主题在android4.0 及其以上不需要任何支持包,继承Activity即使用,但google不推荐该用法 Theme.Material主题在android5.0及其以上不需要依 ...

  4. Idea的Git使用

    在使用Git来pull和push代码的时候会发生冲突的情况,如果处理不当则会出现无法pull和push代码的情况.所以这个是十分有必要注意的. 那么我来说几句自己的总结吧: 1.先看下idea的Git ...

  5. byte数组和int互转

    import java.nio.ByteBuffer; public class Program { public static void main(String[] args) { ByteBuff ...

  6. SQLite使用教程4 创建数据库

    http://www.runoob.com/sqlite/sqlite-create-database.html SQLite 创建数据库 SQLite 的 sqlite3 命令被用来创建新的 SQL ...

  7. hdu 5438 Ponds 拓扑排序

    Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...

  8. UITableViewCell 高度自适应

    UITableViewCell 高度自适应一直是我们做动态Cell高度时遇到的最烦躁的问题,Cell动态高度计算可以去看看sunny的这篇文章介绍,今天主要和大家分享下我在使用systemLayout ...

  9. Android权限设置android.permission完整列表

    android.permission.ACCESS_CHECKIN_PROPERTIES允许读写访问"properties”表在checkin数据库中,改值可以修改上传( Allows re ...

  10. 内核日志及printk结构浅析

      作者:tekkamanninja 鸣谢:感谢ChinaUnix技术社区的tekkamanninja提供稿件 ,如需转载,请注明出处. 这段时间复习了一下内核调试系统,注意看了一下printk的实现 ...