转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/52813227 【DylanAndroid的csdn博客】


在android中使用最多的就是ListView,GridView,用到这两个控件那么肯定要用到适配器,那就是定义一个类继承BaseAdapter,让后覆写它里面的getCount(),getView()等方法,下面来写一个demo。

1.我们来实现一个普通的ListView的Demo

  • 主布局文件:activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.kejiang.yuandl.fastdev.MainActivity"><ListView
        android:id="@+id/listview"android:layout_width="wrap_content"android:layout_height="wrap_content" />
    </RelativeLayout>
  • ListView的item布局:item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"><TextView
        android:text="万能适配器测试"android:layout_width="match_parent"android:layout_height="100px"android:gravity="center"android:id="@+id/textView" />
    </LinearLayout>
  • ListView的适配器代码:MyAdapter.java

    /*** * Created by yuandl on 2016-10-14.* *listView的适配器*/public class MyAdapter extends BaseAdapter {private Context context;private List<String> datas;public MyAdapter(Context context, List<String> datas) {this.context = context;this.datas = datas;}@Overridepublic int getCount() {return datas == null ? 0 : datas.size();}@Overridepublic String getItem(int position) {return datas.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder;if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.item, null);viewHolder = new ViewHolder();viewHolder.textView = (TextView) convertView.findViewById(R.id.textView);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}String name = datas.get(position);viewHolder.textView.setText(name);return convertView;}private class ViewHolder {public TextView textView;}}
    
  • 使用:MainActivity.java
public class MainActivity extends Activity {private WebView webView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);myAdapterTest();}/*** 普通适配器的方法*/private void myAdapterTest() {setContentView(R.layout.activity_main);ListView listView= (ListView) findViewById(R.id.listview);List<String> datas=new ArrayList<>();datas.add("普通适配器测试1");datas.add("普通适配器测试2");datas.add("普通适配器测试3");datas.add("普通适配器测试4");listView.setAdapter(new MyAdapter(context,datas));}}
  • 看效果图

2.打造万能适配器第一步,万能ViewHolder–CommonViewHolder


import android.util.SparseArray;
import android.view.View;/*** Created by yuandl on 2016-10-13.* 万能的ViewHolder** @author*/
public class CommonViewHolder {/*** @param view 所有缓存View的根View* @param id   缓存View的唯一标识* @return*/public static <T extends View> T get(View view, int id) {SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();//如果根view没有用来缓存View的集合if (viewHolder == null) {viewHolder = new SparseArray<View>();view.setTag(viewHolder);//创建集合和根View关联}View chidlView = viewHolder.get(id);//获取根View储存在集合中的孩纸if (chidlView == null) {//如果没有改孩纸//找到该孩纸chidlView = view.findViewById(id);viewHolder.put(id, chidlView);//保存到集合}return (T) chidlView;}
}

3.打造万能适配器的最后封装–CommonAdapter


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;import java.util.List;/*** Created by yuandl on 2016-10-13.* 万能适配器*/public abstract class CommonAdapter<T> extends BaseAdapter {private Context context;private List<T> datas;private int layoutId;public CommonAdapter(Context context, List<T> datas, int layoutId) {this.context = context;this.datas = datas;this.layoutId = layoutId;}@Overridepublic int getCount() {return datas == null ? 0 : datas.size();}@Overridepublic T getItem(int position) {return datas.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = LayoutInflater.from(context).inflate(layoutId, null);}T t = getItem(position);convertView(convertView, t);return convertView;}/*** 需要去实现的对item中的view的设置操作* @param item* @param t*/protected abstract void convertView(View item, T t);}

4.万能适配器CommonAdapter的超简洁用法

  • 使用代码
     public class MainActivity extends Activity {private WebView webView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);myAdapterTest();}/*** 万能适配器的方法*/private void commonAdapterTest() {setContentView(R.layout.activity_main);ListView listView= (ListView) findViewById(R.id.listview);List<String> datas=new ArrayList<>();datas.add("万能适配器测试1");datas.add("万能适配器测试2");datas.add("万能适配器测试3");datas.add("万能适配器测试4");listView.setAdapter(new CommonAdapter<String>(context,datas,R.layout.item) {@Overrideprotected void convertView(View item, String s) {TextView textView=  CommonViewHolder.get(item,R.id.textView);textView.setText(s);}});}}
  • 运行效果

    GitHub源码地址:https://github.com/linglongxin24/ListViewUpdate/blob/master/app/src/main/java/cn/bluemobi/dylan/listviewupdate/adapter/CommonAdapter.java

Java泛型应用之打造Android中ListView和GridView万能适配器【CommonAdapter】--超简洁写法相关推荐

  1. android通用listview和gridview万能适配器实现的两种方式

    Listview和gridview是超级常用组件,于是乎,应该封装一下直接拿来用用而不是每次都写Adapter,这样多么的麻烦是不.虽然国内外大牛都有封装过,但是我总结了两个封装好的Adapter分享 ...

  2. 基于ListView、GridView万能适配器

    项目结构 A:使用ViewHolder优化,在其中可以添加许多方法.如果没提供方法也可在在使用的时候,根据ID再做逻辑事物判断. public class ViewHolder {// 存放所有ite ...

  3. android中ListView控件onItemClick事件中获取listView传递的数据

    http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...

  4. Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (下)

    上一篇博客我们已经带大家简单的吹了一下IoC,实现了Activity中View的布局以及控件的注入,如果你不了解,请参考:Android 进阶 教你打造 Android 中的 IOC 框架 [View ...

  5. android listview 数据同步,android中ListView数据刷新时的同步方法

    本文实例讲述了android中ListView数据刷新时的同步方法.分享给大家供大家参考.具体实现方法如下: public class Main extends BaseActivity { priv ...

  6. android Java开发设计模式及在android中的应用解析

    android Java开发设计模式及在android中的应用解析 什么是设计模式: 可以用一句话概括设计模式---设计模式是一种利用OOP的封闭.继承和多态三大特性,同时在遵循单一职责原则.开闭原则 ...

  7. android listview高级,Android中Listview点赞功能的实现

    最近这段时间一直在看Android,利用Listview去实现点赞功能,下面给大家介绍下基本思路. 基本思路: 进入界面–>获取数据–> 在Listview中显示–> 通过map集合 ...

  8. Android中ListView选中事件setOnItemSelectedListener无反应不生效问题

    Android中ListView选中事件setOnItemSelectedListener无反应不生效问题 在学习Android中ListView组件时,android模拟器运行app时,发现点击有反 ...

  9. android listview 分析,Android中ListView用法实例分析

    本文实例分析了Android中ListView用法.分享给大家供大家参考,具体如下: 通过在Layout中添加ListView Widget可以达到在页面布局具有列表效果的交互页面.在这里通过举例来说 ...

最新文章

  1. 中国人工智能AI框架自主研发
  2. 海思3559A上编译OpenCV4.1.0源码操作步骤
  3. 【开发环境】为 Visual Studio Community 2013 版本安装中文语言包 ( 安装 Test Agents 2013 | 安装 Visual Studio 2013 简体中文 )
  4. 在SIMULINK实现各类优化类算法的仿真——粒子群算法、细菌觅食、
  5. 【数据竞赛】Kaggle GM秘技:树模型初始化技巧
  6. thinkphp中mysql添加数据_thinkphp添加数据 add()方法
  7. mysql 8 多线程_mysql8 参考手册--通用线程状态
  8. helloworld代码_12 种主流编程语言输出“Hello World”
  9. shell脚本基础练习题
  10. spark MetaException(message:Version information not found in metastore. )
  11. 计算机制作培训通知知识点,计算机学习计划(通用3篇)
  12. 自动阅卷的原理很简单的,用python来简单解释一下工作原理❤
  13. 多元函数极限求法(二元函数)
  14. Harpoon: an OSINT / Threat Intelligence tool
  15. C# 实现 简体<--->繁体 的互相转换
  16. STM32外部中断的关闭和打开
  17. 聚观早报 | 恒大汽车或将被并购;比亚迪今年将进入丹麦市场
  18. ruby的DIR.pwd
  19. Configuration Manager 2012 R2基础知识
  20. 蓝汛之5376脚位图

热门文章

  1. BZOJ3698 XWW的难题(上下界网络流+gap优化的细节处理)
  2. 哈工大软件构造第一章
  3. 解析 float : left
  4. UnionPay-银联支付-netcore(二)
  5. 火狐浏览器如何设置默认打开网页
  6. 无法安装此计算机不存在英特尔,win10系统提示无法安装驱动程序,此计算机中没有Intel适配器怎么办...
  7. python 学生信息管理系统(二)
  8. 面向接口编程思想(转)
  9. ctr多少正常_你知道亚马逊的点击率多少算正常的吗?
  10. 考勤月度统计mysql_mysql中跨月统计考勤天数-问答-阿里云开发者社区-阿里云