Android万能适配器
2015-09-25 11:37
459 查看
Android 万能适配器
数据集List<T>:ListView --->Adapter extends BaseAdapter -->ViewHolder(对应ListView的item,提高控件的查询效率)
对于数据集List<T>比较多的情况下,我们要考虑提取和创建公共的ViewHolder和Adapter
1.创建公共的ViewHolder
分析:通用的ViewHolder类,是通过convertView.setTag(holder);ViewHolder:Item各种控件的引用
容器:Map<int ,View>--->SparseArray,SparseArray的效率高于Map<int ,View>;
getView(int id)
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=...
holder.getView(viewId);
holder.getView(viewId).setText(...)
}
代码:
adapter:
ListView焦点问题:
item控件抢占焦点,第一种解决办法:
设置抢占焦点item控件的属性:
android:focusable="false"
第二种解决办法:
找到item布局对象,设置属性:
android:descendantFocusability="blocksDescendants"
ListView convertView复用问题
第一种方法:cb.setChecked(entity.isChecked());//在实体类中标记选中状态,实体类对象是不复用的
cb.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
entity.setChecked(cb.isChecked());
}
});
第二种方法:定义一个集合 private List<Integer> mPos=new ArrayList<Integer>();
cb.setChecked(false);
if(mPos.contains(holder.getPosition())){
cb.setChecked(true);
}
cb.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(cb.isChecked()){
mPos.add(holder.getPosition());
}else{
mPos.remove((Integer)holder.getPosition());
}
}
});
代码链接:
http://pan.baidu.com/s/1c0kBztI
http://pan.baidu.com/s/1eQJJoLO
数据集List<T>:ListView --->Adapter extends BaseAdapter -->ViewHolder(对应ListView的item,提高控件的查询效率)
对于数据集List<T>比较多的情况下,我们要考虑提取和创建公共的ViewHolder和Adapter
1.创建公共的ViewHolder
分析:通用的ViewHolder类,是通过convertView.setTag(holder);ViewHolder:Item各种控件的引用
容器:Map<int ,View>--->SparseArray,SparseArray的效率高于Map<int ,View>;
getView(int id)
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=...
holder.getView(viewId);
holder.getView(viewId).setText(...)
}
代码:
package com.zmj.utils;
import android.content.Context; import android.graphics.Bitmap; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView;
public class ViewHolder { private SparseArray<View> mViews; private int mPosition; private View mConvertView; public ViewHolder(Context context,ViewGroup parent,int layoutId,int position){ this.mPosition=position; this.mViews=new SparseArray<View>(); mConvertView=LayoutInflater.from(context).inflate(layoutId, parent,false); mConvertView.setTag(this); } public static ViewHolder getConvertView(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; } } /** * 通过viewId获取控件 * @param viewId * @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 * @param text * @return */ public ViewHolder setText(int viewId,String text){ TextView tv=getView(viewId); tv.setText(text); return this; } public ViewHolder setImageResource(int viewId,int resId){ ImageView view=getView(viewId); view.setImageResource(resId); return this; } public ViewHolder setImageBitmap(int viewId,Bitmap bitmap){ ImageView view=getView(viewId); view.setImageBitmap(bitmap); return this; } public ViewHolder setImageUrl(int viewId,String url){ ImageView view=getView(viewId); //ImageLoader.getInstance().loadImage(view,url); return this; } }
adapter:
package com.zmj.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; public abstract class CommonAdapter <T> extends BaseAdapter { protected Context context; protected List<T> mDatas; private LayoutInflater mInflater; private int layoutId; public CommonAdapter(Context context,List<T> datas,int layoutId){ this.context=context; this.mDatas=datas; mInflater=LayoutInflater.from(context); this.layoutId=layoutId; } @Override public int getCount() { return mDatas.size(); } @Override public T getItem(int position) { return mDatas.get(position); } @Override public long getItemId(int position) { return position; } /** * 更新ListView * @param apk_list */ public void onDateChange(List<T> datas ) { this.mDatas = datas; this.notifyDataSetChanged(); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder=ViewHolder.getConvertView(context, convertView, parent, layoutId, position); convert(holder,getItem(position)); return holder.getConvertView(); } public abstract void convert(ViewHolder holder ,T t); }
ListView焦点问题:
item控件抢占焦点,第一种解决办法:
设置抢占焦点item控件的属性:
android:focusable="false"
第二种解决办法:
找到item布局对象,设置属性:
android:descendantFocusability="blocksDescendants"
ListView convertView复用问题
第一种方法:cb.setChecked(entity.isChecked());//在实体类中标记选中状态,实体类对象是不复用的
cb.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
entity.setChecked(cb.isChecked());
}
});
第二种方法:定义一个集合 private List<Integer> mPos=new ArrayList<Integer>();
cb.setChecked(false);
if(mPos.contains(holder.getPosition())){
cb.setChecked(true);
}
cb.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(cb.isChecked()){
mPos.add(holder.getPosition());
}else{
mPos.remove((Integer)holder.getPosition());
}
}
});
代码链接:
http://pan.baidu.com/s/1c0kBztI
http://pan.baidu.com/s/1eQJJoLO
相关文章推荐
- Android UI学习 - Menu
- android中Handle类的用法实例分析
- android 混淆打包
- Android - 线程同步
- android sdk 加密 混淆
- 安卓APK反编译与混淆编译
- Android中插件开发篇之----动态加载Activity(免安装运行程序)
- Android中ClearEditText实现点击EditText输入框右边清除图标来清除输入内容的两种方式
- Android中插件开发篇之----应用换肤原理解析
- 获得android 应用的版本和当前android系统版本
- android布局layout中的一些属性
- 【Android】解决软键盘遮挡登陆按钮
- 初学android 从配置环境变量开始
- android HAL 理解
- Android是如何绘制View的
- Android实战简易教程<二十>(GridView长按显示删除)
- android 电容屏(二):驱动调试之基本概念篇
- Android实战简易教程<十九>(SwipeRefreshLayout下拉刷新使用实例)
- Android实战简易教程<十八>(ViewPager组件详解)
- Android实战简易教程<十七>(LayoutAnimation布局动画)