Java泛型应用之打造Android中ListView和GridView万能适配器【CommonAdapter】--超简洁写法
转载请注明出处: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】--超简洁写法相关推荐
- android通用listview和gridview万能适配器实现的两种方式
Listview和gridview是超级常用组件,于是乎,应该封装一下直接拿来用用而不是每次都写Adapter,这样多么的麻烦是不.虽然国内外大牛都有封装过,但是我总结了两个封装好的Adapter分享 ...
- 基于ListView、GridView万能适配器
项目结构 A:使用ViewHolder优化,在其中可以添加许多方法.如果没提供方法也可在在使用的时候,根据ID再做逻辑事物判断. public class ViewHolder {// 存放所有ite ...
- android中ListView控件onItemClick事件中获取listView传递的数据
http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...
- Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (下)
上一篇博客我们已经带大家简单的吹了一下IoC,实现了Activity中View的布局以及控件的注入,如果你不了解,请参考:Android 进阶 教你打造 Android 中的 IOC 框架 [View ...
- android listview 数据同步,android中ListView数据刷新时的同步方法
本文实例讲述了android中ListView数据刷新时的同步方法.分享给大家供大家参考.具体实现方法如下: public class Main extends BaseActivity { priv ...
- android Java开发设计模式及在android中的应用解析
android Java开发设计模式及在android中的应用解析 什么是设计模式: 可以用一句话概括设计模式---设计模式是一种利用OOP的封闭.继承和多态三大特性,同时在遵循单一职责原则.开闭原则 ...
- android listview高级,Android中Listview点赞功能的实现
最近这段时间一直在看Android,利用Listview去实现点赞功能,下面给大家介绍下基本思路. 基本思路: 进入界面–>获取数据–> 在Listview中显示–> 通过map集合 ...
- Android中ListView选中事件setOnItemSelectedListener无反应不生效问题
Android中ListView选中事件setOnItemSelectedListener无反应不生效问题 在学习Android中ListView组件时,android模拟器运行app时,发现点击有反 ...
- android listview 分析,Android中ListView用法实例分析
本文实例分析了Android中ListView用法.分享给大家供大家参考,具体如下: 通过在Layout中添加ListView Widget可以达到在页面布局具有列表效果的交互页面.在这里通过举例来说 ...
最新文章
- 中国人工智能AI框架自主研发
- 海思3559A上编译OpenCV4.1.0源码操作步骤
- 【开发环境】为 Visual Studio Community 2013 版本安装中文语言包 ( 安装 Test Agents 2013 | 安装 Visual Studio 2013 简体中文 )
- 在SIMULINK实现各类优化类算法的仿真——粒子群算法、细菌觅食、
- 【数据竞赛】Kaggle GM秘技:树模型初始化技巧
- thinkphp中mysql添加数据_thinkphp添加数据 add()方法
- mysql 8 多线程_mysql8 参考手册--通用线程状态
- helloworld代码_12 种主流编程语言输出“Hello World”
- shell脚本基础练习题
- spark MetaException(message:Version information not found in metastore. )
- 计算机制作培训通知知识点,计算机学习计划(通用3篇)
- 自动阅卷的原理很简单的,用python来简单解释一下工作原理❤
- 多元函数极限求法(二元函数)
- Harpoon: an OSINT / Threat Intelligence tool
- C# 实现 简体<--->繁体 的互相转换
- STM32外部中断的关闭和打开
- 聚观早报 | 恒大汽车或将被并购;比亚迪今年将进入丹麦市场
- ruby的DIR.pwd
- Configuration Manager 2012 R2基础知识
- 蓝汛之5376脚位图
热门文章
- BZOJ3698 XWW的难题(上下界网络流+gap优化的细节处理)
- 哈工大软件构造第一章
- 解析 float : left
- UnionPay-银联支付-netcore(二)
- 火狐浏览器如何设置默认打开网页
- 无法安装此计算机不存在英特尔,win10系统提示无法安装驱动程序,此计算机中没有Intel适配器怎么办...
- python 学生信息管理系统(二)
- 面向接口编程思想(转)
- ctr多少正常_你知道亚马逊的点击率多少算正常的吗?
- 考勤月度统计mysql_mysql中跨月统计考勤天数-问答-阿里云开发者社区-阿里云