Android_ListView适配器

ListView如何优化

  • 复用convertView缓存(减少ListView绘制).
  • 自定义静态类ViewHolder(减少findViewById次数),通过setTag()、getTag()获取holder实例.
  • 使用分页加载.
  • 使用软引用WeakReference引用ImageView对象:当item划出屏幕,可以释放对大图片的引用,节省内存,提高效率.
  • 另外对图片还可以使用LruCache和三级缓存来优化.

正常使用方式

public class MyAdapter extends BaseAdapter { private LayoutInflater mInflater; private Context ctx; private List<String> mDatas; public MyAdapter(Context ctx, List<String> mDatas) { mInflater = LayoutInflater.from(ctx); this.ctx = ctx; this.mDatas = mDatas; } @Override public int getCount() { return mDatas.size(); // 固定 } @Override public Object getItem(int position) { return mDatas.get(position); // 固定 } @Override public long getItemId(int position) { return position; // 固定 } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { // 复用convertView缓存 convertView = mInflater.inflate(R.layout.item_str, null); // 条目布局 holder = new ViewHolder(); holder.tv = (TextView) convertView.findViewById(R.id.tv); // holder存储控件 convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.tv.setText(mDatas.get(position)); return convertView; } private final class ViewHolder { TextView tv; } }

上述代码大家都很熟悉,基本遇到就是一套,都写烂了,分析一下

  • 复写的三个方法都是固定的,很好抽取.
  • getView中通过set、get处理ViewHolder对象可以抽取.
  • holder中的findViewById可以抽取.

提炼

PART_A:Adapter

package com.catface.cadapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; import android.widget.BaseAdapter; import java.util.List; /** * @desc 使用泛型,接收不同类型的对象 */ public abstract class CAdapter<T> extends BaseAdapter { protected Context ctx; protected List<T> datas; protected LayoutInflater inflater; private int layoutId; // arg1-3:上下文 | 集合<泛型bean> | 条目布局 public CAdapter(Context ctx, List<T> datas, int layoutId) { this.ctx = ctx; this.datas = datas; this.inflater = LayoutInflater.from(ctx); this.layoutId = layoutId; } @Override public int getCount() { return datas == null ? 0 : datas.size(); } @Override public T getItem(int position) { return datas == null ? null : datas.get(position); } @Override public long getItemId(int position) { return position; } /** * @desc 1.获取ViewHolder对象(上下文、复用缓存、父布局、条目布局) */ @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = ViewHolder.get(ctx, convertView, parent, layoutId, position); convert(holder, getItem(position)); // ------>> 暴露抽象方法 return holder.getConvertView(); // 设置结束各个组件,返回ViewHolder对象方便继续设置控件值 } /** * @desc 暴露出去并传入holder与bean:拿着控件设置值 */ public abstract void convert(ViewHolder holder, T t); }

PART_B:ViewHolder

package com.catface.cadapter;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Paint;
import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.os.Build; import android.text.util.Linkify; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AlphaAnimation; import android.widget.Checkable; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.RatingBar; import android.widget.TextView; /** * @desc 待修复问题: * * 1.CheckBox选中错位(复用convertView所致) √ * a.在Bean中添加isChecked字段 * b.在ListView中用ArrayList数组记录holder中当前选中的CheckBox * * 2.图片显示错位 × * * 3.上拉刷新 + 下拉加载 × */ public class ViewHolder { private Context ctx; // 上下文 private View convertView; // 复用缓存 private int mLayoutId; // 条目布局 private SparseArray<View> views; // 各组件及对应id(SparseArray代替HashMap,提高效率) private int position; public ViewHolder(Context ctx, ViewGroup parent, int layoutId, int position) { this.ctx = ctx; this.convertView = LayoutInflater.from(ctx).inflate(layoutId, parent, false); this.mLayoutId = layoutId; this.views = new SparseArray<View>(); this.position = position; this.convertView.setTag(this); } /** * @desc 通过setTag()和getTag()来获取ViewHolder对象 */ public static ViewHolder get(Context ctx, View convertView, ViewGroup parent, int layoutId, int position) { if (convertView == null) { return new ViewHolder(ctx, parent, layoutId, position); } else { ViewHolder holder = (ViewHolder) convertView.getTag(); holder.position = position; return holder; } } /** * @desc 获取当前holder的position */ public int getPosition() { return position; } public int getLayoutId() { return mLayoutId; } /** * @desc 通过viewId获取控件 */ @SuppressWarnings("unchecked") public <T extends View> T getViewByViewId(int viewId) { View view = views.get(viewId); if (view == null) { view = convertView.findViewById(viewId); views.put(viewId, view); } return (T) view; } public View getConvertView() { return convertView; } /************************************************ PS:图片可以使用第三方工具类加载图片 ************************************************/ /** 设置TextView文本 */ public ViewHolder setText(int viewId, String text) { ((TextView) getViewByViewId(viewId)).setText(text); return this; } /** 设置TextView颜色 */ public ViewHolder setTextColor(int viewId, int textColor) { ((TextView) getViewByViewId(viewId)).setTextColor(textColor); return this; } /** 设置TextView颜色 */ public ViewHolder setTextColorRes(int viewId, int textColorRes) { ((TextView) getViewByViewId(viewId)).setTextColor(ctx.getResources().getColor(textColorRes)); return this; } /** 设置文本字体 */ public ViewHolder setTypeface(Typeface typeface, int... viewIds) { for (int viewId : viewIds) { TextView view = getViewByViewId(viewId); view.setTypeface(typeface); view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG); } return this; } /** 设置图片:资源id */ public ViewHolder setImageResource(int viewId, int resId) { ((ImageView) getViewByViewId(viewId)).setImageResource(resId); return this; } /** 设置图片:Bitmap */ public ViewHolder setImageBitmap(int viewId, Bitmap bitmap) { ((ImageView) getViewByViewId(viewId)).setImageBitmap(bitmap); return this; } /** 设置图片:Drawable */ public ViewHolder setImageDrawable(int viewId, Drawable drawable) { ((ImageView) getViewByViewId(viewId)).setImageDrawable(drawable); return this; } /** 设置背景色 */ public ViewHolder setBackgroundColor(int viewId, int color) { getViewByViewId(viewId).setBackgroundColor(color); return this; } /** 设置背景色 */ public ViewHolder setBackgroundRes(int viewId, int

转载于:https://www.cnblogs.com/YFeiY7/p/5917643.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值