仿乐透购彩app(2)

156 阅读1分钟

仿乐透购彩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());

            }

        };