您的位置:首页 > 移动开发 > Android开发

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

2015-12-31 21:32 417 查看
来自: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: