ListView的优化使用-抽取ViewHolder以及adapter类
来源:互联网 发布:程序员必读书籍 活着 编辑:程序博客网 时间:2024/04/30 07:48
我们先做一些事先的准备代码:
1.首先是就是listview的item布局:listview_item.xml代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:padding="10dp" android:layout_height="match_parent"> <TextView android:id="@+id/tetle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:saveEnabled="true" android:text="android标题" android:textSize="16sp" /> <TextView android:id="@+id/content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/tetle" android:layout_marginTop="5dp" android:saveEnabled="true" android:text="android测试内容显示" android:textSize="16sp" /> <TextView android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/content" android:layout_marginTop="5dp" android:saveEnabled="true" android:text="2016-12-30" android:textSize="16sp" /> <TextView android:id="@+id/phone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_below="@+id/content" android:drawableLeft="@mipmap/ic_launcher" android:drawablePadding="5dp" android:gravity="center" android:text="18720824645" /></RelativeLayout>
2.一个bean文件:
/** * Created by Administrator on 2016/12/30. * * @author diaobao-刘平 */public class Bean { private String title; private String content; private String time; private String phone; public Bean() { } public Bean(String title, String content, String time, String phone) { this.title = title; this.content = content; this.time = time; this.phone = phone; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; }}好了 好了 这里的listview呢! 就自己写了啊 前期工作那就先这些吧 我们进入正题
一、我们先来看看我们通常adapter适配器的使用方法,目的就是做个对比
/** * Created by Administrator on 2016/12/30. * 传统listview的适配器的使用 * @author diaobao-刘平 */public class MyAdapter extends BaseAdapter { private List<Bean> datas = new ArrayList<>(); private LayoutInflater mLayoutInflater; public MyAdapter(Context context, List<Bean> datas) { this.datas = datas; mLayoutInflater = LayoutInflater.from(context); } @Override public int getCount() { return datas.size(); } @Override public Object getItem(int i) { return datas.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View contextView, ViewGroup viewGroup) { Bean bean = (Bean) getItem(i); ViewHolder holder = null; if (contextView == null) { contextView = mLayoutInflater.inflate(R.layout.listview_item, viewGroup, false); holder = new ViewHolder(contextView); contextView.setTag(holder); } else { holder = (ViewHolder) contextView.getTag(); } holder.tetle.setText(bean.getTitle()); holder.time.setText(bean.getTime()); holder.content.setText(bean.getContent()); holder.phone.setText(bean.getPhone()); return contextView; } private class ViewHolder { TextView tetle; TextView content; TextView time; TextView phone; public ViewHolder(View contextView) { tetle = (TextView) contextView.findViewById(R.id.tetle); time = (TextView) contextView.findViewById(R.id.time); content = (TextView) contextView.findViewById(R.id.content); phone = (TextView) contextView.findViewById(R.id.phone); } }}
二、然而我们现在呢来抽取一些我们常用的方法
1.首先呢我们就来抽取一下VivewHolder的类:
/** * Created by Administrator on 2016/12/30. * 在使用adapter时使用的viewholder方法的抽取类-公共类 * * @author diaobao-刘平 */public class ViewHolder { private SparseArray<View> mVIews; private View mConvertView; private int mPosition; /** * 初始化ViewHolder内容 * * @param context 上下文对象 * @param parent ViewGroup的对象-在baseadapter中的getView()中传入 * @param layoutId layout的id-就是listview的item * @param ponstion ponstion的对象-在baseadapter中的getView()中传入 */ public ViewHolder(Context context, ViewGroup parent, int layoutId, int ponstion) { this.mPosition = ponstion; this.mVIews = new SparseArray<View>(); mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false); mConvertView.setTag(this); } /** * @param context 上下文对象 * @param convertView view对象 * @param parent ViewGroup的对象-在baseadapter中的getView()中传入 * @param layoutId layout的id-就是listview的item * @param position ponstion的对象-在baseadapter中的getView()中传入 * @return */ public static ViewHolder Get(Context context, View convertView, ViewGroup parent, int layoutId, int position) { if (convertView == null) { return new ViewHolder(context, parent, layoutId, position); } else { ViewHolder holder = (ViewHolder) convertView.getTag(); holder.mPosition = position; return holder; } } /** * 根据view的id获取控件 * * @param viewId view的id * @param <T> * @return */ public <T extends View> T getVIew(int viewId) { View view = mVIews.get(viewId); if (view == null) { view = mConvertView.findViewById(viewId); mVIews.put(viewId, view); } return (T) view; } public View getConvertView() { return mConvertView; } /** * 我们来偷偷懒 设置常用textview的设置值 这里还可以设置自己想设置的哦 * @param viewId textivew的id * @param text 要设置的值内容 * @return */ public ViewHolder SetText(int viewId, String text) { TextView tv = getVIew(viewId); tv.setText(text); return this; }}2、为了再方便点我们把适配器也抽取了吧:命名一个commonAdapter类
/** * Created by Administrator on 2016/12/30. *提取出来的adapter的公共类 * @author diaobao-刘平 */public abstract class CommonAdapter<T> extends BaseAdapter { protected List<T> mDatas; protected Context mContext; protected LayoutInflater mInflater; public CommonAdapter(Context context, List<T> mDatas) { this.mContext = context; this.mDatas = mDatas; this.mInflater = LayoutInflater.from(context); } @Override public int getCount() { return mDatas.size(); } @Override public Object getItem(int i) { return mDatas.get(i); } @Override public long getItemId(int i) { return i; } //在这里应为getVIew方法是不一样的所以我们得把它公共出去 在这里呢你要是再懒点还可以抽取的哦 自己看着办啊 @Override public abstract View getView(int i, View view, ViewGroup viewGroup);
}3、一系列抽取之后我们在来比比看我们现在的适配器吧:第一个MyVivwHolderAdapter类
** * Created by Administrator on 2016/12/30. * 使用ViewHolder的适配器的使用 * * @author diaobao-刘平 */public class MyViewHolderAdapter extends CommonAdapter<Bean> { public MyViewHolderAdapter(Context context, List<Bean> datas) { super(context,datas); } @Override public View getView(int i, View contextView, ViewGroup viewGroup) { Bean bean = (Bean) getItem(i); ViewHolder holder = ViewHolder.Get(mContext, contextView, viewGroup, R.layout.listview_item, i); holder.SetText(R.id.tetle,bean.getTitle()); holder.SetText(R.id.time,bean.getTime()); holder.SetText(R.id.phone,bean.getPhone()); holder.SetText(R.id.content,bean.getContent()); return holder.getConvertView(); }}是不是简单好多了呀 最后结果呢 我就不截图了哦 你们自己运行看看吧 下面给出代码哦
源码下载:源码在这哦
0 0
- ListView的优化使用-抽取ViewHolder以及adapter类
- Android MVP+Adapter+ViewHolder抽取-ListView最终优化
- ListView优化--ViewHolder的使用
- 201.m1-优化抽取Adapter二之抽取ViewHolder
- Iwfu-ListView(一) - ListView使用ViewHolder优化以及ListView的其他
- 使用ViewHolder优化ListView
- 使用ViewHolder优化ListVIew
- listview的Adapter性能优化之viewholder终极用法,无需生成holder内部类类
- listview的优化及viewholder的使用
- 优化ListView使用到的ViewHolder
- listview的优化---viewHolder
- ListView的优化--ViewHolder
- ListView的ViewHolder优化
- ListView中抽取ViewHolder的逻辑操作
- Android数据适配器(Adapter)优化:使用高效的ViewHolder
- Android数据适配器(Adapter)优化:使用高效的ViewHolder
- 安卓 LIstView Adapter使用ViewHolder
- ListView中的Adapter和ViewHolder结合使用
- 微信小程序-WDCP 安装SSL证书教程
- 记一次线上Java程序导致服务器CPU占用率过高的问题排除过程
- 从B树、B+树、B*树谈到R 树
- [bigdata-017] 用Hive操作hbase
- 谈谈Android App混合开发
- ListView的优化使用-抽取ViewHolder以及adapter类
- 20161230 rtlab连接matlab与labview模型(先在word中写的,文字配图全在附件word中)
- mysql 索引 大于等于 走不走索引 最左前缀
- JS循环标签输出
- 星期几
- 【hdu 1847】Good Luck in CET-4 Everybody!
- Android 开发工具之Codota——搜索最好的Android 代码
- 43. Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】
- 好心态