安卓学习笔记之实现通用的适配器(adapter)与ViewHolder

安卓学习笔记之adapter与ViewHolder

第一种实现方式

.让CommonAdapter继承BaseAdapter,并抽象出需要改变内容的方法
.独立出ViewHolder类,用于找到控件id,并存储已经加载的view,设置内容
.List 应用泛型T 指代list集合中某类元素
.通过继承CommonAdapter来创建自己的adapter


CommonAdapter类的代码如下:

package com.yu.adapters.utils;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import com.yu.adapters.News;

public abstract class CommonAdapter<T>  extends BaseAdapter{

    private LayoutInflater inflater;
    private List<T> list; // 应用泛型T 指代list集合中某类元素
    private int layoutId;
    public CommonAdapter(Context context,List<T> list,int layoutId) {
        super();
        this.layoutId = layoutId;
        inflater = LayoutInflater.from(context);
        this.list = list;
    }

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

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public  View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null ;
        if (convertView == null) {
            convertView = inflater.inflate(layoutId, null);
            viewHolder = new ViewHolder(convertView,position);
            convertView.setTag(viewHolder);
        }
        viewHolder = (ViewHolder) convertView.getTag();
        T t = list.get(position);
        setContent(position, viewHolder, t);
        return convertView;
    }

    /**
     * 将需要做改变的内容抽象出来
     * 用于获取控件id 并填充内容
     * @param position  ListView中元素的位置
     * @param viewHolder 
     * @param t  list集合中的元素
     */
    public  abstract void setContent(int position,ViewHolder viewHolder,T t);
}

ViewHolder类如下:
SparseArray 缓存已加载的View

package com.yu.adapters.utils;

import android.util.SparseArray;
import android.view.View;
import android.widget.TextView;

public class ViewHolder {
    private View convertView;
    private SparseArray<View> mView ; //缓存已加载的View
    public ViewHolder(View convertView,int position) {
        super();
        this.convertView = convertView;
        this.mView = new SparseArray<View>();
    }

    /**
     * 通过id获取控件的View
     * @param resId
     * @return
     */
    public <T extends View>T getView(int resId){
        View view =  mView.get(resId);
        if (view == null) {
            view = convertView.findViewById(resId);
            mView.put(resId, view); //存储已经加载的view
        }
        return (T) view;    
    }
    /**
     * 获取convertView
     * @return
     */
    public View getConvertView() {
        return convertView;
    }
    /**
     * 用于设置Textview内容
     * @param resId
     * @param text
     * @return
     */
    public ViewHolder setText(int resId,String text) {
        TextView textView = (TextView)getView(resId);
        textView.setText(text);
        return this;
    }
}

第二种方法实现方式

.让CommonAdapter继承BaseAdapter,并抽象出需要改变内容的方法,并将convertView的初始化放在Viewholder中
.独立出ViewHolder类,用于找到控件id,并存储已经加载的view,设置内容
.List 应用泛型T 指代list集合中某类元素
.通过继承CommonAdapter来创建自己的adapter
(引自幕课网老师的方法撰写而得)

CommonAdapter如下:

package com.yu.utils;

import java.util.List;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import com.imooc.adapters.News;

public abstract class CommonAdapter<T> extends BaseAdapter {
    private List<T> list;
    private Context context;
    private int layoutId;
    public CommonAdapter(List<T> list,Context context,int layoutId) {
        super();
        this.layoutId = layoutId;
        this.context = context;
        this.list = list;
    }

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

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = ViewHolder.getHolder(context, convertView, layoutId, position,null);
        T t = list.get(position);
        convert(viewHolder, t, position);
        return viewHolder.getConvertView();
    }

    public abstract  void convert(ViewHolder viewHolder,T t,int position);
}

ViewHolder的代码:

package com.yu.utils;
import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class ViewHolder {
    private  View convertView;
    private SparseArray<View> views ;
    private int mPosition;
    public ViewHolder(View convertView,int position) {
        this.convertView = convertView;
        this.mPosition = position;
        views = new SparseArray<View>();
    }
    public int getPosition() {
        return mPosition;
    }
    public void setPosition(int mPosition) {
        this.mPosition = mPosition;
    }
    public static ViewHolder getHolder(Context context,View convertView,int layoutId,int position,ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(layoutId, parent);
            viewHolder = new ViewHolder(convertView, position);
            convertView.setTag(viewHolder);
        }{
            viewHolder = (ViewHolder) convertView.getTag();
        }

        return viewHolder;
    }

    public <T extends View>T getView(int id) {
        View view = views.get(id);
        if (view == null) {
            view = convertView.findViewById(id);
            views.put(id, view);
        }
        return (T) view;
    }
    /**
     * 获取convertView
     */
    public View getConvertView() {
        return convertView;
    }

    public ViewHolder setText(int id,String text) {
        TextView textView = getView(id);
        textView.setText(text);
        return this;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值