简单版本,最基本功能
package com.ldcang.utils;
import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
public class ViewHolder{
private final SparseArray<View> views;
private View convertView;
private ViewHolder(Context context , int layoutId){
this.views = new SparseArray<View>();
this.convertView = LayoutInflater.from(context).inflate(layoutId, null, false);
convertView.setTag(this);
}
public static ViewHolder get(View convertView , Context context , int layoutId){
if (convertView == null) {
return new ViewHolder(context , layoutId);
}
ViewHolder existedHolder = (ViewHolder) convertView.getTag();
return existedHolder;
}
@SuppressWarnings("unchecked")
public <T extends View> T getView(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;
}
}
这是适配器中使用这个万能ViewHolder的使用方法,其中会遇到控件复用引起的各种问题,采用
SparseBooleanArray sparseBooleanArray = new SparseBooleanArray();来记录每个item中的控件复用情况。
public class ImgsAdapter extends BaseAdapter {
Context context;
List<String> data;
public Bitmap bitmaps[];
Util util;
OnItemClickClass onItemClickClass;
SparseBooleanArray sparseBooleanArray = new SparseBooleanArray();
DisplayImageOptions options = new DisplayImageOptions.Builder()
// 设置图片在下载期间显示的图片
.showImageOnLoading(R.drawable.nothumb)
// 设置图片Uri为空或是错误的时候显示的图片
.showImageForEmptyUri(R.drawable.nothumb)
// 设置图片加载/解码过程中错误时候显示的图片
.showImageOnFail(R.drawable.nothumb)
// 设置下载的图片是否缓存在内存中
.cacheInMemory(true)
// 设置下载的图片是否缓存在SD卡中
.cacheOnDisc(true)
// 保留Exif信息
.considerExifParams(true)
// 设置图片以如何的编码方式显示
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
// 设置图片的解码类型
// .bitmapConfig(Bitmap.Config.RGB_565)
// .decodingOptions(android.graphics.BitmapFactory.Options
// decodingOptions)//设置图片的解码配置
.considerExifParams(true)
// 设置图片下载前的延迟
.delayBeforeLoading(100)// int
// delayInMillis为你设置的延迟时间
// 设置图片加入缓存前,对bitmap进行设置
// .preProcessor(BitmapProcessor preProcessor)
.resetViewBeforeLoading(true)// 设置图片在下载前是否重置,复位
// .displayer(new RoundedBitmapDisplayer(20))//是否设置为圆角,弧度为多少
.displayer(new FadeInBitmapDisplayer(100))// 淡入
.build();
@SuppressLint("InflateParams")
public ImgsAdapter(Context context, List<String> data,
OnItemClickClass onItemClickClass) {
this.context = context;
this.data = data;
this.onItemClickClass = onItemClickClass;
bitmaps = new Bitmap[data.size()];
util = new Util(context);
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int arg0) {
return data.get(arg0);
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
ViewHolder mViewHolder = ViewHolder.get(arg1, context,
R.layout.imgsitem);
arg1 = mViewHolder.getConvertView();
ImageView imageView = mViewHolder.getView(R.id.imageView12);
CheckBox checkBox = mViewHolder.getView(R.id.checkBox12);
//如果这里没有对options中的配置,则imageview的复用会出现图片乱换的问题,应该是 resetViewBeforeLoading(true)这个的设置问题
ImageLoader.getInstance().displayImage("file://" + data.get(arg0),imageView, options);
//在这里判断sparseBooleanArray里面是否已经添加了选中的控件
if(sparseBooleanArray.get(arg0)){
checkBox.setVisibility(View.VISIBLE);
checkBox.setChecked(true);
}
else{
checkBox.setChecked(false);
checkBox.setVisibility(View.GONE);
}
arg1.setOnClickListener(new OnPhotoClick(arg0, checkBox));
return arg1;
}
public SparseBooleanArray getSparseBooleanArray() {
return sparseBooleanArray;
}
public void setSparseBooleanArray(SparseBooleanArray sparseBooleanArray) {
this.sparseBooleanArray = sparseBooleanArray;
}
}
下面是activity中item点击事件对复用控件的操作
public void OnItemClick(View v, int Position, CheckBox checkBox ) {
String filapath = fileTraversal.filecontent.get(Position);
if (checkBox.isChecked()) {
checkBox.setChecked(false);
checkBox.setVisibility(View.GONE);
select_layout.removeView(hashImage.get(Position));
filelist.remove(filapath);
//将取消选中后的控件从SparseBooleanArray中去除
imgsAdapter.getSparseBooleanArray().put(Position, false);
choise_button.setText("选择了(" + select_layout.getChildCount()+ ")张");
} else {
try {
checkBox.setVisibility(View.VISIBLE);
checkBox.setChecked(true);
//将点击后的控件添加到SparseBooleanArray中
imgsAdapter.getSparseBooleanArray().put(Position, true);
Log.i("img", "img choise position->" + Position);
ImageView imageView = iconImage(filapath, Position,
checkBox);
if (imageView != null) {
hashImage.put(Position, imageView);
filelist.add(filapath);
select_layout.addView(imageView);
choise_button.setText("选择了("+ select_layout.getChildCount() + ")张");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}