Android打造listview万能适配器(下)

来自:http://www.imooc.com/learn/372
我们接上篇文章,现在将建立一个通用的抽象的BaseAdapter。
1 新建CommonAdapter继承自BaseAdapter

package com.baseadapter.utils;

import java.util.List;

import com.baseadapter.bean.Bean;
import com.example.imooc_baseadapter.R;

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

/**
 * 编写通用的Adapter,指定泛型,以便适应不同的Java bean
 * @param <T>
 */
public abstract class CommonAdapter<T> extends BaseAdapter {
    //这些属性都是每个适配器中都能用到的,访问控制符设置为protected,以便继承的子类都能访问
    protected LayoutInflater mInflater;
    protected List<T> mDatas;//数据源
    protected Context mContext;
    protected int layoutId;//item布局文件

    public CommonAdapter(Context context, List<T> mDatas, int layoutId) {
        this.mContext = context;
        this.mDatas = mDatas;
        mInflater = LayoutInflater.from(context);
        this.layoutId = layoutId;
    }

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

    @Override
    public T getItem(int position) {//这里的返回值类型是T,不是自动生成的Object
        return mDatas.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        //初始化ViewHolder,加载我们的item布局文件
        ViewHolder holder = ViewHolder.get(mContext, convertView, parent, layoutId, position);
        convert(holder, getItem(position));//getItem(position)的类型就是T,这句话在子类中的具体实现就是给具体的控件初始化
        //并赋值,初始化赋值控件时需要viewHolder和具体的数据Java bean,在这里抽象出来就是类型T
        return holder.getConvertView();//返回convertView
    }
    public abstract void convert(ViewHolder holder, T t);

}

2 修改我们的MyAdapterWithCommonViewHolder,使之继承自我们定义的抽象通用的CommonAdapter

package com.example.imooc_baseadapter;

import java.util.List;

import javax.security.auth.PrivateCredentialPermission;

import com.baseadapter.bean.Bean;
import com.baseadapter.utils.CommonAdapter;
import com.baseadapter.utils.ViewHolder;

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

/**
 * 修改此适配器,使之继承自我们定义的抽象通用的CommonAdapter
 */
public class MyAdapterWithCommonViewHolder extends CommonAdapter<Bean> {

    public MyAdapterWithCommonViewHolder(Context context, List<Bean> datas) {
        super(context, datas, R.layout.item);
    }

    @Override
    public void convert(ViewHolder holder, Bean bean) {
        TextView title = holder.getView(R.id.id_title);
        title.setText(bean.getTitle());
        //上面的两句话可以合并为((TextView)holder.getView(R.id.id_title)).setText(bean.getTitle());
        TextView desc = holder.getView(R.id.id_desc);
        desc.setText(bean.getDesc());
        TextView time = holder.getView(R.id.id_time);
        time.setText(bean.getTime());
        TextView phone = holder.getView(R.id.id_phone);
        phone.setText(bean.getPhone());

    }

}

我们从以上代码可以看出,优化后的代码,我们只需要在convert(ViewHolder holder, Bean bean)方法中找到我们在item中的控件并设置相应的数值即可,那么,我们也可以在ViewHolder中将引用控件并赋值的工作也完成了。如下,继续优化
1 在ViewHolder类中添加给控件赋值的方法,因为本案例都是TextView,因此代码如下:

/**
* 找到我们定义的TextView控件,并给控件赋值
 */
public ViewHolder setText(int viewId, String text)
{
    TextView tv = getView(viewId);
    tv.setText(text);
    return this;
}

2 修改MyAdapterWithCommonViewHolder中convert下面的代码即可

holder.setText(R.id.id_title, bean.getTitle())
        .setText(R.id.id_desc, bean.getDesc())
        .setText(R.id.id_time, bean.getTime())
        .setText(R.id.id_phone, bean.getPhone());

至此,我们对适配器的优化已经结束了。另外,我们可以在ViewHolder中添加对其他控件赋值的方法,本例我们只是setText给Textview赋值,我们还可以给ImageView设置图片资源,比如:

/**
     * 如果item中有ImageView控件的话,我们就可以用此方法给控件设置图片资源
     */
    public ViewHolder setImageResource(int viewId, int resId)
    {
        ImageView imageView = getView(viewId);
        imageView.setImageResource(resId);
        return this;
    }
    public ViewHolder setImageBitmap(int viewId, Bitmap bitmap)
    {
        ImageView imageView = getView(viewId);
        imageView.setImageBitmap(bitmap);
        return this;
    }
    //我们还可以添加其他的更多的方法。。。。。。。。。。。

源码在这里:http://download.csdn.net/detail/hnyzwtf/9386086

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值