android开发中,我们离不开adapter,每个项目都有很多地方需要adapter,那么我们如何让自己少写adapter代码呢?那就是封装adapter,让我们的adapter成为万能的adapter。下面我列出我实现的思路,供给大家学习与参考,当然有更好的方式也可以提供建议哦。

一、针对Listview或GridView的万能适配器(源码)


1.第一步实现公用的viewholder
/**
* 优化adapter用的ViewHolder
* Created by admin on 17/8/2.
*/ public class ViewHolder { //当前item的view
private View mContentView;
// 用于存储id用的容器
private SparseArray<View>mViews; public ViewHolder(Context context, ViewGroup parent, int position, @LayoutRes int layoutId){ this.mViews = new SparseArray<>();
this.mContentView = LayoutInflater.from(context).inflate(layoutId,parent,false);
this.mContentView.setTag(this);
} /**
* 创建view
* @param context
* @param contentView
* @param parent
* @param position
* @param layoutId
* @return
*/
public static ViewHolder createView(Context context,View contentView,ViewGroup parent,int position,@LayoutRes int layoutId){ if(contentView==null){ return new ViewHolder(context,parent,position,layoutId); }else { ViewHolder holder = (ViewHolder) contentView.getTag(); return holder;
} } /**
* 提供view给外部访问
* @return
*/ public View getContentView() {
return mContentView;
} /**
* 通过id获取控件
* @param id
* @param <T>
* @return
*/
public <T extends View> T getViewById(@IdRes int id){ View view = mViews.get(id);
if(view==null){ view = mContentView.findViewById(id);
mViews.put(id,view);
} return (T)view; } /**
* 这里是设置文字当然还可以扩展更多如果有需要自己按这种方式实现一下就可以的
* @param id
* @param text
* @return
*/
public ViewHolder setText(@IdRes int id,CharSequence text){ TextView view = getViewById(id);
view.setText(text);
return this;
} } 2.第二步实现公用的adapter
/**
* 公用adapter
* Created by admin on 17/8/2.
*/ public abstract class CommonAdapter<T> extends BaseAdapter { private List<T>list;
private Context context;
private int layoutId;
public CommonAdapter(Context context,List<T>list,int layoutId){ this.context=context;
this.list=list;
this.layoutId=layoutId;
} @Override
public int getCount() {
return list==null? 0:list.size();
} @Override
public Object getItem(int position) {
return list.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = ViewHolder.createView(context,convertView,parent, position, layoutId);
this.onBind(holder,list.get(position));
return holder.getContentView();
} protected abstract void onBind(ViewHolder holder,T model);
} 这样就可以实现万能的adapter了,接下来我们就只需要继承这个万能适配器就可以了轻松绑定数据了。
3.调用
public class MainActivity extends AppCompatActivity {
    private List<String>list=new ArrayList<>();

   private ListView mListView;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_butt_test);
       this.mListView = this.findViewById(R.id.listView)

for(int i=0;i<30;i++){ list.add("测试数据"+(i+1));
} mListView.setAdapter(new CommonAdapter<String>(this,list,R.layout.list_item) {
@Override
protected void onBind(ViewHolder holder, String model) {
           //只需在这里绑定数据就ok了
               holder.setText(R.id.title,model);

            }
});
}
}
												

android 手写万能adapter适配器的更多相关文章

  1. Android 手写Binder 教你理解android中的进程间通信

    关于Binder,我就不解释的太多了,网上一搜资料一堆,但是估计还是很多人理解的有困难.今天就教你如何从 app层面来理解好Binder. 其实就从我们普通app开发者的角度来看,仅仅对于androi ...

  2. 【开源项目】Android 手写记事 App(半成品)

    该项目已上传到 CSDN 的 Git 平台中 项目地址:https://code.csdn.net/gd920129/whiteboard GIT SSH:git@code.csdn.net:gd92 ...

  3. Android—万能ListView适配器

    ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义. 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家. 首先有一个自定义的 ...

  4. Android开发之万能适配器

    ListView.GridView等等非常多的东西都需要适配器.而如果开发一个app每一个listview都有写一个Adapter的话,那还怎么愉快的玩游戏.. 什么是ViewHolider以及的用法 ...

  5. android打造万能的适配器(转)

    荒废了两天,今天与大家分享一个ListView的适配器 前段时间在学习慕课网的视频,觉得这种实现方式较好,便记录了下来,最近的项目中也使用了多次,节省了大量的代码,特此拿来与大家分享一下. 还是先看图 ...

  6. Android中ListView 控件与 Adapter 适配器如何使用?

    一个android应用的成功与否,其界面设计至关重要.为了更好的进行android ui设计,我们常常需要借助一些控件和适配器.今天小编在android培训网站上搜罗了一些有关ListView 控件与 ...

  7. opencv 手写选择题阅卷 (四)Android端 手机应用开发

    opencv 手写选择题阅卷 (四)Android 手机应用开发 在PC端把代码调通以后开始开发Android 手机应用,因为主要功能代码为C++代码,所以需要通过NDK编译,JAVA通过JNI方式调 ...

  8. android 开源 OCR 项目 及手写识别

    http://blog.csdn.net/archfree/article/details/6023676 1)一个为Android平台,将识别由手机的相机拍摄的图像文本应用程序. http://co ...

  9. Android Binder机制详解:手写IPC通信

    想要掌握一样东西,最好的方式就是阅读理解它的源码.想要掌握Android Binder,最好的方式就是写一个AIDL文件,然后查看其生成的代码.本文的思路也是来自于此. 简介 Binder是Andro ...

随机推荐

  1. python-socket1

    如何理解socket编程 就是两个进程,跨计算机,他俩需要通讯的话,需要通过网络对接起来.这就是 socket 的作用.打个比方吧,两个进程在两个计算机上,需要有一个进程做被动方,叫做服务器.另一个做 ...

  2. AngularJS-指令command

    directive: 匹配模式restrict:'AEMC'默认为A template templateUrl templateCache:把模板缓存起来,共多个指令使用 var myModule = ...

  3. codeforces 652B B. z-sort(水题)

    题目链接: B. z-sort time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  4. [转]_int64、long long 的区别

    大学生程序代写 C++的64位整数[原]by 赤兔 http://baike.baidu.com/view/1235293.htm 在做ACM题时,经常都会遇到一些比较大的整数.而常用的内置整数类型常 ...

  5. Linux下几种RTP协议实现的比较和JRTPLIB编程讲解

    流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议. IP电话等应用场合的技术基础.RTP是进行实时流媒体传输的标准协议和关 ...

  6. Agc_006 E Rotate 3x3

    题目大意 给定一个$3\times N$的方阵,每个位置的数恰好是每一个$[1,3\times N]$中的数. 初始时,每个位置$[x,y]$填的是$3(y-1)+x,(1\leq x\leq N,1 ...

  7. uoj problem 11 ydc的大树

    题目大意: 给定一颗黑白树.允许删除一个白点.最大化删点后无法与删点前距自己最远的黑点连通的黑点个数.并求出方案数. 题解: 这道题很棒棒啊. 一开始想了一个做法,要用LCT去搞,特别麻烦而且还是\( ...

  8. bzoj 4631: 踩气球 线段树

    题目: Description 六一儿童节到了, SHUXK 被迫陪着M个熊孩子玩一个无聊的游戏:有N个盒子从左到右排成一排,第i个盒子里装着Ai个气球. SHUXK 要进行Q次操作,每次从某一个盒子 ...

  9. 洛谷P2896 [USACO08FEB]一起吃饭Eating Together

    题目描述 The cows are so very silly about their dinner partners. They have organized themselves into thr ...

  10. mongodb数据迁移的两种方式

    环境说明:bbs数据采集的数据越来越多,目前是50G,每天大概以200W的数据量增长.而当前服务器1.2上面的空间不足,需要把数据迁移到空间足够大的1.3上面去 尝试了2种方式对数据进行迁移,一种是r ...