Android开发之万能适配器

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();

代码:

 1 package com.example.list_view;
 2 import android.content.Context;
 3 import android.util.SparseArray;
 4 import android.view.LayoutInflater;
 5 import android.view.View;
 6 import android.view.ViewGroup;
 7
 8 public class easyViewHolder {
 9
10     private SparseArray<View> sparseArray;
11     private Context context;
12     private int LayoutId;
13     private View convertview;
14     public easyViewHolder(Context mcontext,View mconvertview,int LayoutId,ViewGroup parent)
15     {
16         this.context=mcontext;
17         this.sparseArray=new SparseArray<View>();
18         this.convertview=LayoutInflater.from(mcontext).inflate(LayoutId, parent, false);
19         convertview.setTag(this);
20     }
21     public static easyViewHolder get(Context context,View convertview,int LayoutId,ViewGroup parent)
22     {
23         if (convertview==null)
24         {
25             return new easyViewHolder(context, convertview, LayoutId, parent);
26         }
27
28
29             // 特别需要注意的一点,由于ListView的复用,比如屏幕只显示5个Item,那么当下拉到第6个时会复用第1个的Item,所以这边需要更新position
30             return  (easyViewHolder)convertview.getTag();
31
32     }
33     public <T extends View> T getView(int viewId)//通过id找到组件
34     {
35         View view = sparseArray.get(viewId);
36         if (view==null)
37         {
38             view=(View)this.convertview.findViewById(viewId);
39             sparseArray.put(viewId, view);
40         }
41         return (T)view;
42
43     }
44     public View getConvertView()
45     {
46         return this.convertview;
47     }
48 }

再封装一个适配器:

声明一个抽象类

1、保留不变的方法

2、修改getview()

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

 1 package com.example.list_view;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 import android.content.Context;
 7 import android.view.LayoutInflater;
 8 import android.view.View;
 9 import android.view.ViewGroup;
10 import android.widget.BaseAdapter;
11
12 public abstract class easyAdapter<T> extends BaseAdapter {
13
14     private Context context;
15     private ArrayList<T> data;
16     private LayoutInflater inflater;
17     private int LayoutId;
18     easyViewHolder easyholder;
19     public easyAdapter( Context context,ArrayList<T> data,int layoutid)
20     {
21         this.context=context;
22         this.data=data;
23         inflater.from(context);
24         this.LayoutId=layoutid;
25     }
26     @Override
27     public int getCount() {
28         // TODO Auto-generated method stub
29         return data.size();
30     }
31
32     @Override
33     public Object getItem(int arg0) {
34         // TODO Auto-generated method stub
35         return arg0;
36     }
37
38     @Override
39     public long getItemId(int arg0) {
40         // TODO Auto-generated method stub
41         return arg0;
42     }
43
44     @Override
45     public View getView(int arg0, View arg1, ViewGroup arg2) {
46         // TODO Auto-generated method stub
47         final easyViewHolder easyholder=getHolder(context, arg1, LayoutId, arg2);
48         setConverView(easyholder,data.get(arg0));//需要用户复写传值
49         return easyholder.getConvertView();
50     }
51      public abstract void setConverView(easyViewHolder easyViewHolder, T t);
52      public static easyViewHolder getHolder(Context context,View convertview,int LayoutId,ViewGroup parent)
53     {
54             return easyViewHolder.get(context, convertview, LayoutId, parent);
55     }
56 }

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

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

 1 package com.example.list_view;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 import android.content.Context;
 7 import android.widget.ImageView;
 8 import android.widget.TextView;
 9
10 public class MyAdapter extends easyAdapter<User> {
11
12     public MyAdapter(Context context, ArrayList<User> data, int layoutId) {
13         super(context, data, layoutId);
14         // TODO Auto-generated constructor stub
15     }
16 //只需在下面函数传入你所需要的值
17     public void setConverView(easyViewHolder myViewHolder, User t) {
18         // TODO Auto-generated method stub
19
20         ((ImageView)myViewHolder.getView(R.id.imageview)).setImageResource(R.drawable.icon1);
21         ((TextView)myViewHolder.getView(R.id.title)).setText(t.getTitle());
22         ((TextView)myViewHolder.getView(R.id.text)).setText(t.getText());
23
24     }
25
26 }

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。

时间: 2024-10-12 16:43:21

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

Android中的万能适配器——base-adapter-helper解析

在Android开发中,我们经常会用到ListView.GridView,每次编码的时候都需要为他们写对应的Adapter,写多了就感觉很烦躁了,因为基本的编程思想都是一样的,但是每次都要重复去写,所以我们能不能把它们抽象成一个通用的模板,这样就不用每次都重复写相同的代码了,直接重复使用,这样不是更好,下面我们就来介绍介绍一个开源项目base-adapter-helper. 传统Adapter的编码思路,主要看Adapter中的getView方法. public View getView(int

android开发笔记之打造终极适配器

大家看到这个标题是不是觉得很诧异呢?什么叫终极适配器,其实就是这种适配器是万能的,所有需要使用适配器的组件,都可用这一个适配器就行. 既然这样,就来讲讲吧. 效果: 当然这是个简单的布局,用普通的适配器也可以实现,这里只是用它来做个例子,用终极适配器的话,以后你换其他布局,适配器是不用变的,减少了很多代码. 首先普通的适配器的写法是: public class MyAdapter extends BaseAdapter{ private Context mContext; private Lis

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

1. Android 万能适配器      项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都需要去继承一个BaseAdapter,然后实现里面的一大堆方法,而我们每次最关心的无非就是getView方法,其余的方法几乎都是相同代码.这里是不是就可以优化起来呢?在其次,我们在使用Adapter的时候,为了优化性能,常常会创建一个Holder.而Holder里面每次存放的都是View,对Hole

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

为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需要,因此我们时常要去继承BaseAdapter类去实现一个自定义的适配器来满足我们的场景需要. 如果你是开发一个简单点的APP还好,可能ListView和GridView的数量不会太多,我们只要去写几个BaseAdapter实现类就可以了. 但如果有一天,你需要开发一个APP里面具有几十个ListV

Android开发之适配器-ListView适配器的重复数据

适配器是Android中的数据与View视图的桥梁,作用就是将数据通过适配器显示到对应的View视图上. 工作中,在用ListView做适配器数据时候,有些人肯定碰见过,如何优化效率,但是又出现重复数据的情况,如何避免重复数据而且又能提高ListView大数据量时候的效率呢?,解决方案就是2点: 1. 在getView方法中 进行View的判断,即做convertView ==null 这样的判断,这样是为了提高数据量大的时候的效率. 2.设置数据用setTag()/getTag()方法来进行对

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

转载请注明出处谢谢:http://www.cnblogs.com/liushilin/p/5720926.html 很不好意思让大家久等了,本来昨天就应该写这个的,无奈公司昨天任务比较紧,所以没能按时给大家带来RecyclerView的适配器,楼主对期待的小伙伴表示最深刻地歉意. 如果你没有看前面的万能的ListView,GridView等的万能适配器,楼主推荐你去看一看,当然,大牛就免了. 另外,楼主今天在构思这个RecyclerView的过程中发现前天写的ListView有点毛病,现在楼主已

Android之ListView性能优化——万能适配器

如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有觉得有什么不好的.直到最近在慕课网上看到鸿洋大神讲的“机器人小慕”和“万能适配器”两节课,才对BaseAdapter有所了解.看了鸿洋大神的课程之后,我又上网搜了几个博客,也看了一些源码和文档,于是打算写一个帖子来记录一下自己的学习历程. 在今天的帖子中,我们从一个最基本的实现BaseAdapter

Android开发中的MVP架构(转)

写在前面,本博客来源于公众号文章:http://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=402435540&idx=1&sn=1cd10bd9efaac7083575367a8b4af52f&scene=1&srcid=0910ARzPpBvVYPI1NDBZnixa#wechat_redirect 最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目

Android 开发第七弹:简易时钟(秒表)

本文承接,Android 开发第五弹:简易时钟(闹钟) 和 Android 开发第六弹:简易时钟(计时器),这一部分是关于秒表的. 布局 同样是新建一个类(StopWatchView)并扩展自LinearLayout,并将其用作布局. <myapplication.nomasp.com.clock.StopWatchView android : id = "@+id/tabStopWatch" android : layout_width = "match_parent