万能适配器终结

96 阅读1分钟

通用型ViewHolder

private SparseArray mViews;
用来存储listviewitem布局文件的控件的容器 是一个Map形式,
比Map效率高, SpareArray
put(int, view);

第一次由于直接将容器最终化,大致listView布局显示内容出现问题

package com.chb.beautifalGrils.app.adapter;

import javax.crypto.spec.PSource;

import com.chb.beautifalGrils.R;

import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * 万能适配器的ViewHolder
 * @author chb
 *
 */
public class MagicViewHolder {
    private SparseArray<View> mViews;

    /**
     * 复用性的convertView
     */
    private View convertView;
    private int position;

    private MagicViewHolder(Context mContext, ViewGroup parent, int layoutId, int position) {
        this.convertView = LayoutInflater.from(mContext).inflate(layoutId, parent, false);
        this.position = position;
        this.mViews = new SparseArray<View>();
        this.convertView .setTag(this);
    }
    /**
     * 获取MagicViewHolder对象
     * @return
     */
    public static MagicViewHolder getMagicViewHolder(Context mContext, View convertView, ViewGroup parent, int layoutId, int position) {
        if(convertView == null){
            return new MagicViewHolder(mContext, parent, layoutId, position);
        }else {
            MagicViewHolder magicViewHolder = (MagicViewHolder) convertView.getTag();
            magicViewHolder.position = position;//convertView是复用的, position是更新的
            return magicViewHolder;
        }
    }

    /**
     * 获取item中的控件
     * @param viewId
     */
    public View getView(int viewId){
        View view = mViews.get(viewId);
        if(view == null){
            view = convertView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        return view;
    }
    /**
     * 获取复用的
     * @return
     */
    public View getConvertView() {
        return convertView;
    }
    /**
     * 
     * @return
     */
    public int getPosition() {
        return position;
    }




}

通用适配器

package com.chb.beautifalGrils.app.adapter;

import java.util.List;

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;
    /**
     * item布局id
     */
    private int layoutId;
    /*
     * 上下文
     */
    private Context mContext;

    public CommonAdapter(List<T> datas, int layoutId, Context mContext) {
        this.datas = datas;
        this.layoutId = layoutId;
        this.mContext = mContext;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return datas.size();
    }

    @Override
    public Object getItem(int paramInt) {
        // TODO Auto-generated method stub
        return datas.get(paramInt);
    }

    @Override
    public long getItemId(int paramInt) {
        // TODO Auto-generated method stub
        return paramInt;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        MagicViewHolder magicViewHolder = MagicViewHolder.getMagicViewHolder(mContext, convertView, parent, layoutId, position);
        doView(magicViewHolder, position);
        return magicViewHolder.getConvertView();
    }


    /**
     * 对item中的布局控件设置赋值
     * @param position 
     * @param magicViewHolder 
     */
    protected abstract void doView(MagicViewHolder magicViewHolder, int position);

}