安卓学习笔记之adapter与ViewHolder
第一种实现方式
.让CommonAdapter继承BaseAdapter,并抽象出需要改变内容的方法
.独立出ViewHolder类,用于找到控件id,并存储已经加载的view,设置内容
.List 应用泛型T 指代list集合中某类元素
.通过继承CommonAdapter来创建自己的adapter
CommonAdapter类的代码如下:
package com.yu.adapters.utils;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.yu.adapters.News;
public abstract class CommonAdapter<T> extends BaseAdapter{
private LayoutInflater inflater;
private List<T> list; // 应用泛型T 指代list集合中某类元素
private int layoutId;
public CommonAdapter(Context context,List<T> list,int layoutId) {
super();
this.layoutId = layoutId;
inflater = LayoutInflater.from(context);
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null ;
if (convertView == null) {
convertView = inflater.inflate(layoutId, null);
viewHolder = new ViewHolder(convertView,position);
convertView.setTag(viewHolder);
}
viewHolder = (ViewHolder) convertView.getTag();
T t = list.get(position);
setContent(position, viewHolder, t);
return convertView;
}
/**
* 将需要做改变的内容抽象出来
* 用于获取控件id 并填充内容
* @param position ListView中元素的位置
* @param viewHolder
* @param t list集合中的元素
*/
public abstract void setContent(int position,ViewHolder viewHolder,T t);
}
ViewHolder类如下:
SparseArray 缓存已加载的View
package com.yu.adapters.utils;
import android.util.SparseArray;
import android.view.View;
import android.widget.TextView;
public class ViewHolder {
private View convertView;
private SparseArray<View> mView ; //缓存已加载的View
public ViewHolder(View convertView,int position) {
super();
this.convertView = convertView;
this.mView = new SparseArray<View>();
}
/**
* 通过id获取控件的View
* @param resId
* @return
*/
public <T extends View>T getView(int resId){
View view = mView.get(resId);
if (view == null) {
view = convertView.findViewById(resId);
mView.put(resId, view); //存储已经加载的view
}
return (T) view;
}
/**
* 获取convertView
* @return
*/
public View getConvertView() {
return convertView;
}
/**
* 用于设置Textview内容
* @param resId
* @param text
* @return
*/
public ViewHolder setText(int resId,String text) {
TextView textView = (TextView)getView(resId);
textView.setText(text);
return this;
}
}
第二种方法实现方式
.让CommonAdapter继承BaseAdapter,并抽象出需要改变内容的方法,并将convertView的初始化放在Viewholder中
.独立出ViewHolder类,用于找到控件id,并存储已经加载的view,设置内容
.List 应用泛型T 指代list集合中某类元素
.通过继承CommonAdapter来创建自己的adapter
(引自幕课网老师的方法撰写而得)
CommonAdapter如下:
package com.yu.utils;
import java.util.List;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.imooc.adapters.News;
public abstract class CommonAdapter<T> extends BaseAdapter {
private List<T> list;
private Context context;
private int layoutId;
public CommonAdapter(List<T> list,Context context,int layoutId) {
super();
this.layoutId = layoutId;
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = ViewHolder.getHolder(context, convertView, layoutId, position,null);
T t = list.get(position);
convert(viewHolder, t, position);
return viewHolder.getConvertView();
}
public abstract void convert(ViewHolder viewHolder,T t,int position);
}
ViewHolder的代码:
package com.yu.utils;
import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class ViewHolder {
private View convertView;
private SparseArray<View> views ;
private int mPosition;
public ViewHolder(View convertView,int position) {
this.convertView = convertView;
this.mPosition = position;
views = new SparseArray<View>();
}
public int getPosition() {
return mPosition;
}
public void setPosition(int mPosition) {
this.mPosition = mPosition;
}
public static ViewHolder getHolder(Context context,View convertView,int layoutId,int position,ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(layoutId, parent);
viewHolder = new ViewHolder(convertView, position);
convertView.setTag(viewHolder);
}{
viewHolder = (ViewHolder) convertView.getTag();
}
return viewHolder;
}
public <T extends View>T getView(int id) {
View view = views.get(id);
if (view == null) {
view = convertView.findViewById(id);
views.put(id, view);
}
return (T) view;
}
/**
* 获取convertView
*/
public View getConvertView() {
return convertView;
}
public ViewHolder setText(int id,String text) {
TextView textView = getView(id);
textView.setText(text);
return this;
}
}