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

来源:互联网 发布:阿里云空间代理 编辑:程序博客网 时间:2024/05/17 02:52

来自: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 0
原创粉丝点击