万能ViewHolder

简单版本,最基本功能

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();
                }
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值