仿乐透购彩app(2) 主界面——万能适配器
将ViewHolder 提取, 形成一个公用的ViewHolder ,
(1) 复用ConvertView,
(2)每个ViewHolder存储一个item中的布局的控件使用Map<viewid, view>, 但是map的效率低 ,使用android推荐的SparseArray存储view
(3)根据复用convertView是否为空,设置是否创建Viewholder,还是getTag();
(4)提供一个获取convertView的方法, 为了适配器的使用getView().
(5)提供一个获取itme布局中控件的方法,getView(int viweId)。
package com.chb.letou.view.adapter;
import com.chb.letou.R;
import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView.FindListener;
/**
*
* @author Administrator
*
*/
public class MagicViewHolder {
/**
* item复用view
*/
private View convertView;
/**
* ListView中item位置
*/
private int position;
/**
*
*/
private final SparseArray<View> mViews;
/**
* 只执行一次
* @param layoutId
* @param mContext
* @param convertView
* @param parent
* @param position
*/
public MagicViewHolder(int layoutId, Context mContext,
ViewGroup parent, int position) {
this.mViews = new SparseArray<View>();
convertView = LayoutInflater.from(mContext)
.inflate(R.layout.goucai_item_layout, parent, false);
//设置tag
convertView.setTag(this);
}
/**
* 获取MagicViewHolder
*
* @param layoutId
* @param mContext
* @param convertView
* @param parent
* @param position
* @return
*/
public static MagicViewHolder getMagicViewHolder(int layoutId, Context mContext, View convertView,
ViewGroup parent, int position){
MagicViewHolder mvh = null;
if(convertView == null){
mvh = new MagicViewHolder(layoutId, mContext, parent, position);
}else {
mvh = (MagicViewHolder) convertView.getTag();
}
return mvh;
}
/**
* 获取复用convertview
* @return
*/
public View getConvrtView() {
return convertView;
}
/**
* 根据指定的item中控件的viewId获取View
* @param viewId
* @return
*/
@SuppressWarnings("unchecked")
public <T extends View> T getView(int viewId){
try {
View view = mViews.get(viewId);
if(view == null){
view = convertView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T)view;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
二 提取适配器方法, 创建一个公用的适配器
package com.chb.letou.view.adapter;
import java.util.List;
import com.chb.letou.entity.Bean;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
public abstract class CommonAdapter<T extends Bean> extends BaseAdapter {
/**
* 数据源
*/
private List<T> datas;
/**
* 上下文
*/
private Context mContext;
/**
* 布局文件
*/
private int layoutId;
public CommonAdapter(List<T> datas, Context mContext, int layoutId) {
super();
this.datas = datas;
this.mContext = mContext;
this.layoutId = layoutId;
}
@Override
public int getCount() {
return datas.size();
}
@Override
public Object getItem(int position) {
return datas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MagicViewHolder mvh = MagicViewHolder
.getMagicViewHolder(layoutId, mContext, convertView, parent, position);
T t = datas.get(position);
doView(mvh, t);
return mvh.getConvrtView();
}
/**
* item布局的赋值
*/
protected abstract void doView( MagicViewHolder mvh, T t);
}
三、调用万能适配器:
commonAdapter = new CommonAdapter<SubBean>(datas, SecondAcitivity.this, R.layout.goucai_item_layout) {
@Override
protected void doView(MagicViewHolder mvh, SubBean t) {
SubBean subBean = t;
Log.i("tag", "SubBean:::"+subBean);
ImageView iv = mvh.getView(R.id.main_tab1_list_icon);
iv.setImageResource(subBean.getIcon());
TextView title = mvh.getView(R.id.tab1_list_title);
title.setText(subBean.getTitle());
TextView text = mvh.getView(R.id.tab1_list_text);
text.setText(subBean.getText());
}
};