1. 程式人生 > >ListView 和GroupView之萬能介面卡

ListView 和GroupView之萬能介面卡

ViewHoler的編寫:

public class ViewHoler {
    
    private SparseArray<View> mViews; //用於儲存View控制元件
    private int mPostion;             //postion當前的條目
    private View mConverview;       
    
     //私有化構造器
    private ViewHoler(Context context, ViewGroup preant, int layoutId, int position) {
 
        this.mPostion = position;
        this.mViews = new SparseArray<>();
        mConverview = LayoutInflater.from(context).inflate(layoutId, preant, false);
       /* mConverview = View.inflate(context, layoutId, preant);*/
        mConverview.setTag(this);
    }
    

    //單利模式獲取ViewHolder物件
    public static ViewHoler getInstance(Context context, ViewGroup preant, int layoutId, View convertView, int position) {
        if (convertView == null) {
            return new ViewHoler(context, preant, layoutId, position);
        } else {
            ViewHoler viewHoler = (ViewHoler) convertView.getTag();
            viewHoler.mPostion = position;
            return viewHoler;
        }
    }


    //獲取當前物件
    public <T extends View> T getView(int viewId) {
        View view = mViews.get(viewId);
        if (view == null) {
            view = mConverview.findViewById(viewId);
            mViews.put(viewId, view);
        }
        return (T) view;
    }
    

    //獲取當前的converView
    public View getConverview() {
        return mConverview;
    }
    

    //設定文字
    public ViewHoler setText(int viewId, String context) {
        TextView tv = getView(viewId);
        tv.setText(context);
        return this;
    }
    

    //設定圖片
    public ViewHoler setImageResource(int viewId, int resout) {
        ImageView im = getView(viewId);
        im.setImageResource(resout);
        return this;
    }

    //.......相應的新增自己想要的功能如獲取網路圖片等

}

 Adapter的編寫:

public abstract class CommonAdapter<T> extends BaseAdapter {
    
    protected Context mContext; //定義Context物件
    protected List<T> datas;    //List集合使用了T的應用可以把它當成一個類
    protected LayoutInflater mInflater;   

    //例項化佈局物件    
    public CommonAdapter(Context mContext, List<T> datas) {
        this.mContext = mContext;
        this.datas = datas;
        mInflater = LayoutInflater.from(mContext);
    }

    @Override
    public int getCount() {
        return datas.size();
    }

    @Override
    public T 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) {
        ViewHoler viewHoler = ViewHoler.getInstance(mContext, parent,         R.layout.layout_iteam_list, convertView, position);
        convert(viewHoler, getItem(position));
        return viewHoler.getConverview();
    }
    
     //寫一個抽象方法把viewholder 和 當前的資料提供出去
    public abstract void convert(ViewHoler holer, T t);
}

使用方法:

JavaBean的封裝

public class Bean {
    private String title;
    private String desc;
    private int picUrl;

    public Bean(String title, String desc, int picUrl) {
        this.title = title;
        this.desc = desc;
        this.picUrl = picUrl;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public int getPicUrl() {
        return picUrl;
    }

    public void setPicUrl(int picUrl) {
        this.picUrl = picUrl;
    }
}
mcontext-->Context物件
beans ---> 一個List泛型為自定義的物件
listview.setAdapter(new CommonAdapter<Bean>(mcontext, beans) {
            @Override
            public void convert(ViewHoler holer, Bean bean) {
                holer.setText(R.id.txt_title, bean.getTitle())
                        .setText(R.id.txt_desc, bean.getDesc())
                        .setImageResource(R.id.iv_image, R.mipmap.ic_launcher);
            }
        });