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. MarkDown不支持图片放缩。。

    ![](http://images2015.cnblogs.com/blog/573995/201604/573995-20160430162211050-1357272526.jpg =100x20 ...

  2. HTML a标签如何设置margin属性(转)

    很多同学发现对DIV有效的许多CSS属性对<a>或<p>标签都无效,好比说 <div style="margin-top:5px;"></ ...

  3. HLSL学习笔记(一):基础

    http://www.cnblogs.com/rainstorm/archive/2013/05/04/3057444.html 前言 五一在家无事,于是学习了一下HLSL,基于XAN4.0的.学习完 ...

  4. JS上传图片-通过FileReader获取图片的base64

    下面文章,我想要的是: FileReader这个对象,可以借助FileReader来获取上传图片的base64,就可以在客户端显示该图片了.同时,还可以把该图片的base64发送到服务端,保存起来. ...

  5. Python:easygui的安装、导入、使用、设置

    转于:https://blog.csdn.net/sinat_37390744/article/details/55211652 博主:钏的博客 一.下载安装 1)下载0.96的easygui.htt ...

  6. 安装pyenv版本管理

    系统:Centos7.4 安装pyenv是为了更好的管理python的版本. 在进行安装操作之前,首先使用普通用户test,进行操作,如下: #安装之前先安装依赖的库 [test@localhost ...

  7. 数组排序----Demo

    //选择排序,分为简单选择排序.树形选择排序(锦标赛排序).堆排序 此算法为简单选择排序 public static void selectSort(int[] a){ for(int i=0;i&l ...

  8. LAMP 1.8默认虚拟主机

    默认虚拟主机是为了解决别人域名恶心绑定自己的服务器ip,可导致服务器上的网站排名靠后,即干扰seo优化 我们访问指定的两个网站可以直接访问,ip也可以访问 打开配置文件 vim /usr/local/ ...

  9. JavaScript中设置cookie的值

    cookie 与 session 是网页开发中常用的信息存储方式.Cookie是在客户端开辟的一块可存储用户信息的地方:Session是在服务器内存中开辟的一块存储用户信息的地方.JavaScript ...

  10. Sequence Models 笔记(一)

    1 Recurrent Neural Networks(循环神经网络) 1.1 序列数据 输入或输出其中一个或两个是序列构成.例如语音识别,自然语言处理,音乐生成,感觉分类,dna序列,机器翻译,视频 ...