万能适配器

来源:互联网 发布:mac安全控件下载 编辑:程序博客网 时间:2024/04/30 02:43


学无止境,感谢朋友的分享,让我的逼格又提升了一点点。 


你的适配器代码是这样的吗?


package com.customeradapter.adapter;import java.util.List;import android.content.Context;import android.text.Html;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.LinearLayout;import android.widget.TextView;import com.customeradapter.R;import com.customeradapter.bean.Person;public class DataAdapter extends BaseAdapter {    private Context context;    private List<Person> lstPerson;    public DataAdapter(Context context, List<Person> lstPerson) {        this.context = context;        this.lstPerson = lstPerson;    }    @Override    public int getCount() {        return lstPerson == null ? 0 : lstPerson.size();    }    @Override    public Object getItem(int position) {        return lstPerson == null ? 0 : lstPerson.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) {            viewHolder = new ViewHolder();            convertView = LinearLayout.inflate(context, R.layout.item_data, parent);            viewHolder.tvId = (TextView) convertView.findViewById(R.id.tv_id);            viewHolder.tvName = (TextView) convertView.findViewById(R.id.tv_name);            viewHolder.tvAge = (TextView) convertView.findViewById(R.id.tv_age);            viewHolder.tvContent = (TextView) convertView.findViewById(R.id.tv_content);            convertView.setTag(viewHolder);        } else {            viewHolder = (ViewHolder) convertView.getTag();        }        Person person = lstPerson.get(position);        viewHolder.tvId.setText(String.valueOf(person.getId()));        viewHolder.tvName.setText(person.getName());        viewHolder.tvAge.setText(String.valueOf(person.getAge()));        viewHolder.tvContent.setText(Html.fromHtml(person.getContent()));        return null;    }    class ViewHolder {        private TextView tvId;        private TextView tvName;        private TextView tvAge;        private TextView tvContent;    }}



那么我想告诉你的是,我的是这样的:

public class DataAdapter extends CommonAdapter<Person> {    public DataAdapter(Context context, List<Person> datas, int layoutId) {        super(context, datas, R.layout.item_data);    }    @Override    public void convert(CommonViewHolder holder, Person t, List<Person> datas) {        TextView tvId = holder.getView(R.id.tv_id);        TextView tvName = holder.getView(R.id.tv_name);        TextView tvAge = holder.getView(R.id.tv_age);        TextView tvContent = holder.getView(R.id.tv_content);        tvId.setText(String.valueOf(t.getId()));        tvName.setText(t.getName());        tvAge.setText(String.valueOf(t.getAge()));        tvContent.setText(Html.fromHtml(t.getContent()));    }}


是不是减少了好多重复代码?面向对象的终极目标不就是这个效果吗?

“减少重复代码块。”


有人会说了,这是适配器吗?跟我平常的不一样啊。


常用的getCount()getItem()getView()哪去了?


大家不用担心,和你们平常写的没区别,代码差不多,只不过是把这几个重复代码在


CommonAdapter<Person> 里面做了一层封装,


其实万能适配器的原型是这样的CommonAdapter<T>,让我们看看它的真实面目:


package com.customeradapter.adapter;import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;public abstract class CommonAdapter<T> extends BaseAdapter {protected Context context;protected LayoutInflater inflater;protected List<T> datas;protected int layoutId;public CommonAdapter(Context context, List<T> datas, int layoutId) {inflater = LayoutInflater.from(context);this.context = context;this.datas = datas;this.layoutId = layoutId;}@Overridepublic int getCount() {return datas.size();}@Overridepublic T getItem(int position) {return datas.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {CommonViewHolder holder = CommonViewHolder.get(context, convertView, parent, layoutId, position);convert(holder, getItem(position), datas);return holder.getmConvertView();}public abstract void convert(CommonViewHolder holder, T t, List<T> datas);}



看到没,getCount(),getItem(),getView()是不是都回来了,这几个方法里面的代码基本都是一致


的,所以做一层封装对于大多数的listview都能够满足,这里的改造还有很多方法,能不能适配各种奇葩的


listview就要靠大家动脑了,这里就做一个抛砖引玉的效果了。然后将你要写的adapter继承与这个抽象的


CommonAdapter<T>,T是需要传入Adapter的集合里面的数据类型,一般都是自定义的类型,我这里用到的


是Person。最后需要重写的方法,会自动生成的。


下面给出免费的Demo地址:

http://download.csdn.net/detail/zhouhui520w/9124823


0 0
原创粉丝点击