1、简介
在Android开发过程中,我们经常需要写一些ListView和GridView等控件,如果给每一个都写一个适配器的话,过程无疑十分的枯燥,只会消耗大量的时间做这写毫无意义的事情,下面给大家介绍一个通用适配器。
2.一般的适配器的使用
普通的用法是:每一个ListView或者是GridView需要一个资源配置的XML文件,一个ViewHolder,一个普通的继承BaseAdapter的适配器。
1.布局文件

<ListView
        android:id="@+id/listView"android:layout_width="match_parent"android:layout_height="match_parent"
</ListView>

2.Item的布局文件:item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><TextView
        android:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:text="您好!"/>
</RelativeLayout>

3.Adapter

package com.fly.adapter;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;import java.util.List;/*** Created by fly on 2016/10/9.*/public class MyAdapter extends BaseAdapter {private Context context;private LayoutInflater inflater;private List<String> list;public MyAdapter(Context context, List<String> list) {this.context = context;this.list = list;inflater = LayoutInflater.from(context);}@Overridepublic int getCount() {return list.size();}@Overridepublic String getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {convertView = inflater.inflate(R.layout.item, parent);holder = new ViewHolder();holder.textView = (TextView) convertView.findViewById(R.id.textView);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}holder.textView.setText(list.get(position));return convertView;}private class ViewHolder {TextView textView;}
}

相信大家对以上的写法并不陌生,估计有的人都已经写的要吐血了。下面给大家介绍一种通用的适配器。下面我们来总结一下写适配器的所需要的步骤:
1、现在主布局中添加一个ListView的控件;
2、编写一个Item的布局文件;
3、声明一个类继承BaseAdapter,并重写所需要重写的方法;
4、写一个ViewHoler的内部类,里面声明Item中的控件;当是第一次调用该适配器时存储控件,之后直接调用ViewHolder里面声明的控件,用来提高效率。
5、通过getView()方法来实现所需要的功能。
通过总结我们发现上面步骤中1~4完全相同,那么我们的问题来了:能不能将之前的第三步和第四步完全封装到一个类中,以方便我们使用呢?
答案当然是可以的,要不然我怎么接着往下写呢!

首先我们来换个思路,每一个适配器中都需要有一个ViewHolder,那么我们干脆写一个ViewHolder用来放置所有的控件。要放置很多个控件我们可以用到集合和数组,我们还需要通过特定的条件来找到该控件,不然我们怎么用。因此我们可以使用到Map集合来存储各种控件,通过控件的id来获取。有一个SparseArray是对Map集合的封装,是key为Integer的Map集合。因为我们所使用的控件的id都是int类型,所以可以使用该集合。
1、通用的ViewHolder

package com.fly.adapter;import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;/*** Created by fly on 2016/10/9.*/public class CommonViewHolder {//key是Integer类型的Map集合private SparseArray<View> mViews;private View convertView;private CommonViewHolder(Context context, ViewGroup parent, int layoutId, int position) {//初始化mViews = new SparseArray<>();//加载视图convertView = LayoutInflater.from(context).inflate(layoutId, parent,false);convertView.setTag(this);}//CommonViewHolder的入口方法public static CommonViewHolder get(Context context, View convertView, ViewGroup parent, int layoutId, int position) {if (convertView == null) {return new CommonViewHolder(context, parent, layoutId, position);}return (CommonViewHolder) convertView.getTag();}//这里是获取各种viewpublic <T extends View> T getView(int viewId){View view = mViews.get(viewId);if (view == null) {view = convertView.findViewById(viewId);mViews.put(viewId,view);}return (T) view;}//获取convertViewpublic View getConvertView(){return convertView;}
}

写完ViewHolder之后,可以在适配器中使用了,下面是之后的Adapter的代码:

package com.fly.adapter;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;import java.util.List;/*** Created by fly on 2016/10/9.*/public abstract class CommonAdapter<T> extends BaseAdapter {protected Context context;protected List<T> list;protected LayoutInflater inflater;protected int itemLayoutId;public CommonAdapter(Context context, List<T> list, int itemLayoutId) {this.context = context;this.list = list;inflater.from(context);this.itemLayoutId = itemLayoutId;}@Overridepublic int getCount() {return list.size();}@Overridepublic T getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//获取CommonViewHolderCommonViewHolder holder = getCommonViewHolder(position, convertView, parent);//通过getView()获取控件TextView textView = holder.getView(R.id.textView);textView.setText(getItem(position).toString());return holder.getConvertView();}
}

上面的代码可以根据需要传入不同的Java bean或者是类型,就不一一实现了。
下面开始写通用的适配器:
首先我们来分析一下写适配器的步骤:
1、传入一个Context对象;
2、传入一个LayoutInflater对象
3、传入一个List集合
4、根据需求在getView方法中写需求
这样的话我们其实是可以将getView方法提取出来,让其子类去实现该方法。这样的话代码就可以改成这样了:

package com.fly.adapter;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;import java.util.List;/*** Created by lihb on 2016/10/9.*/public abstract class CommonAdapter<T> extends BaseAdapter {protected Context context;protected List<T> list;protected LayoutInflater inflater;protected int itemLayoutId;public CommonAdapter(Context context, List<T> list, int itemLayoutId) {this.context = context;this.list = list;inflater.from(context);this.itemLayoutId = itemLayoutId;}@Overridepublic int getCount() {return list.size();}@Overridepublic T getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic abstract View getView(int position, View convertView, ViewGroup parent);
}
package com.fly.picasso;import android.content.Context;
import android.widget.TextView;import java.util.List;/*** Created by fly on 2016/9/30.*/public class MyAdapter extends CommonAdapter {public MyAdapter(Context context, List list, int itemLayoutId) {super(context, list, itemLayoutId);}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//获取CommonViewHolderCommonViewHolder holder = getCommonViewHolder(position, convertView, parent);//通过getView()获取控件TextView textView = holder.getView(R.id.textView);textView.setText(getItem(position).toString());return holder.getConvertView();}
}

这样的话一个简单的通用适配器就完成了。

Android中通用配器的使用相关推荐

  1. android 计时器工具类,Android中通用定时器--好用的工具

    package com.utility.common; import android.os.Handler; import android.os.Message; public class BaseT ...

  2. Android中的基础控件TextView、Button、ImageView、EditText、ProgressBar

    文章目录 1 Android中的基础控件 1.1 控件的通用属性 2 TextView 2.1 TextView的继承关系 2.2 TextView的常用属性 3 EditText 3.1 常用属性 ...

  3. android外置传感器,Android中外接键盘的检测的实现

    今天来了一个问题:软键盘无法弹出.分析后是因为系统判断当前有外接硬键盘,就会隐藏软键盘.但实际情况并不是这么简单,该问题只有在特定条件下偶现,具体分析过程就不说了,就是软硬键盘支持上的逻辑问题.借着这 ...

  4. Android中的ClassLoader与dex文件加密实现分析

    Android中的ClassLoader BaseDexClassLoader Dex类加载器的基类,包含Dex类加载器之间通用功能的实现. DexClassLoader A class loader ...

  5. android中内存泄露,Android中的内存泄露

    编辑推荐: 本文来自于csdn,本文主要从java的内存模型讲起,最终举出几个内存泄露的例子和解决方案. java运行时内存模型 具体信息:http://gityuan.com/2016/01/09/ ...

  6. Android中的Handler, Looper, MessageQueue和Thread

    前几天,和同事探讨了一下Android中的消息机制,探究了消息的发送和接收过程以及与线程之间的关系.虽然我们经常使用这些基础的东西,但对于其内部原理的了解,能使我们更加容易.合理地架构系统,并避免一些 ...

  7. android drawable 比例,Android中的Drawable基础与自定义Drawable

    转载请注明链接:http://blog..net/feather_wch/article/details/79124608 本文要点: 1. 介绍Android中Drawable的相关知识点,并且介绍 ...

  8. android libbfaac.so,Android中Json数据读取与创建

    一:  Json的特性和在数据交互中的地位就不用说了,直接看案例. 首先在android studio中创建assets文件目录,用于存放Json数据文件,android studio 1.3 默认项 ...

  9. android webview调js方法,Android中WebView与H5的交互,Native与JS方法互调

    项目中经常用到WebView与H5的交互,一个是H5调本地方法,一个是本地调H5方法,在此记录一下. 首先,启用JS支持 //启用js支持 webSettings.setJavaScriptEnabl ...

最新文章

  1. python maketrans方法
  2. Android中Video的三种播放方式的实现
  3. 【星球知识卡片】视频分类与行为识别有哪些核心技术,对其进行长期深入学习...
  4. PCL第三方库:Eigen, Flann , Qhull, VTK, Boost简介
  5. Programming Computer Vision with Python【学习笔记】【第一章】
  6. Java+Selenium3.0----------启动谷歌浏览器及错误处理
  7. yum -y list java* 缓存加载不了_Java开发面试宝典:分布式相关篇
  8. Flipping elements with WPF
  9. 【数论】蓝桥20:数列求值
  10. Netty的并发编程实践2:volatile的正确使用
  11. normalize.css下载
  12. python利用经纬度画地图_使用Python实现画一个中国地图
  13. android app 设计,安卓APP新手设计教程:19条Android设计经验大全
  14. Maven创建一个Servlet项目(五)
  15. “移动互联网+”第一股 正益移动登陆新三板
  16. 下面程序的功能是调用fun函数以删除字符串中指定的字符
  17. 香蕉派 BPI-M2 Zero 四核开源单板计算机 全志 H2+/H3 芯片 高端设计
  18. 新版百度地图的覆盖物描述
  19. 农夫山泉(数据范围是亮点)
  20. 自动化冒烟测试:Unittest vs Pytest框架

热门文章

  1. RabbitMQ优化消息阻塞系列(一)解决方案梳理
  2. 处理 /home/china/.vimrc 时发生错误: 第1行: E492: 不是编辑器的命令
  3. fremaker遍历list_Freemarker中如何遍历List
  4. 如何使用手机把照片压缩到100K?教你手机压缩方法
  5. 选择婚庆公司的注意事项
  6. 活动现场大屏幕互动系统(微信墙)修复版完美PHP源码,带完整素材包和详细使用文档
  7. 用程序 揭秘 用手机号尾号暴露你年龄的 骗局
  8. 用友U9数据库--用户对应的权限明细查询
  9. bios密码解锁软件_你知道自己的电脑还有这么一个BIOS程序吗
  10. 华为手机怎么恢复微信聊天记录(2022最新版)