android 打造ListView和Gridview万能adapter适配器(附源码)

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

}        });    }}
				
时间: 2024-10-16 14:18:23

android 打造ListView和Gridview万能adapter适配器(附源码)的相关文章

Android仿UC浏览器左右上下滚动功能(附源码)

本文要解决在侧滑菜单右边加个文本框,并能实现文本的上下滑动和菜单的左右滚动.这里推荐可以好好看看android的触摸事件的分发机制,这里我就不详细讲了,我只讲讲这个应用.要实现的功能就像UC浏览器(或其它手机浏览器)的左右滚动,切换网页,上下滚动,拖动内容. 目录:一.功能要求与实现       二.布局与代码       三.原理与说明 本文的效果:(源码下载) 一.功能要求与实现 1.功能要求: (1)手指一开始按着屏幕左右移动时,只能左右滚动菜单,如果这时手指一直按着,而且上下移动了,那么

Android中Loader及LoaderManager的使用(附源码下载)

managedQuery方法的缺陷 Loader是用来更好地加载数据的,在我们谈论Loader之前,我们先研究一下Activity的managedQuery方法,该方法也是用于在Activity中加载数据的.在Android 3.0之前的版本中,我们如果想在Activity中通过ContentResolver对ContentProvider进行查询,我们可以方便的调用Activity的managedQuery方法,该方法的源码如下: @Deprecated public final Cursor

Android仿微信底部菜单栏+顶部菜单栏(附源码)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文要实现仿微信微信底部菜单栏+顶部菜单栏,采用ViewPage来做,每一个page对应一个XML,当手指在ViewPage左右滑动时,就相应显示不同的page(其实就是xml)并且同时改变底部菜单按钮的图片变暗或变亮,同时如果点击底部菜单按钮,左右滑动page(其实就是xml)并且改变相应按钮的亮度. 最终效果:源码免费下载 一.布局 1.顶部菜单布局,命名为top_layout.xml

Android Studio 一个完整的APP实例(附源码和数据库)

前言: 这是我独立做的第一个APP,是一个记账本APP. This is the first APP, I've ever done on my own. It's a accountbook APP. 源码: https://github.com/AnneHan/accountBook 欢迎satr or fork 备注: APP中所涉及到的图标请勿商用 效果图 (备注:在把图片制作成gif时,图片的质量受损,所以最终呈现出来的gif图片,背景变得有些模糊) 开发环境 IDE:Android

Android使用xml自定义软键盘效果(附源码)

Android使用xml自定义软键盘效果原理: 1,软键盘其实是个控件,使用android.inputmethodserver.KeyboardView类定义. 2,主布局中使用帧布局,当我们需要显示软键盘时设置为可见,不需要时设置为不可见. 3,编写xml文件,定义键盘内容.使用xml文件填充KeyBoardView布局 4,设置EditText的监听事件. 完成键盘开发. 上效果图: 1,源码研究android.inputmethodserver.KeyboardView: /* * Cop

Android打造(ListView、GridView等)通用的下拉刷新、上拉自动加载的组件

前言 下拉刷新组件在开发中使用率是非常高的,基本上联网的APP都会采用这种方式.对于开发效率而言,使用获得大家认可的开源库必然是效率最高的,但是不重复发明轮子的前提是你得自己知道轮子是怎么发明出来的,并且自己能够实现这些功能.否则只是知道其原理,并没有去实践那也就是纸上谈兵了.做程序猿,动手做才会遇到真正的问题,否则就只是自以为是的认为自己懂了.今天这篇文章就是以自己重复发明轮子这个出发点而来的,通过实现经典.使用率较高的组件来提高自己的认识.下面我们就一起来学习吧. 整体布局结构      

Android Paint的使用以及方法介绍(附源码下载)

要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上.Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法如下: setAntiAlias: 设置画笔的锯齿效果.    setColor: 设置画笔颜色    setARGB:  设置画笔的a,r,p,g值.    setAlpha:  设置Alpha值    setTextSize: 设置字体尺寸.    setStyle:  设置画笔风格,空心或者实心.    

Android中Canvas绘图基础详解(附源码下载)

Android中,如果我们想绘制复杂的自定义View或游戏,我们就需要熟悉绘图API.Android通过Canvas类暴露了很多drawXXX方法,我们可以通过这些方法绘制各种各样的图形.Canvas绘图有三个基本要素:Canvas.绘图坐标系以及Paint.Canvas是画布,我们通过Canvas的各种drawXXX方法将图形绘制到Canvas上面,在drawXXX方法中我们需要传入要绘制的图形的坐标形状,还要传入一个画笔Paint.drawXXX方法以及传入其中的坐标决定了要绘制的图形的形状

Android中的多线程编程(一)附源码

Android中多线程编程:Handler类.Runnable类.Thread类之概念分析 1.Handler类: Handler是谷歌封装的一种机制:可以用来更新UI以及消息的发送和处理.Handler是运行在主线程(UI线程). (2).使用Handler机制的原因: 这是谷歌封装的一种更新UI机制和消息机制,如果不使用这个来更新UI和发送处理消息的时候就会抛出异常. (3).Handler的使用: Handler发送消息其实是发送给自己.也就是说由自己来进行发送和处理.是因为Handler