Android打造listview万能适配器(下)
2015-12-31 21:32
417 查看
来自:http://www.imooc.com/learn/372
我们接上篇文章,现在将建立一个通用的抽象的BaseAdapter。
1 新建CommonAdapter继承自BaseAdapter
2 修改我们的MyAdapterWithCommonViewHolder,使之继承自我们定义的抽象通用的CommonAdapter
我们从以上代码可以看出,优化后的代码,我们只需要在convert(ViewHolder holder, Bean bean)方法中找到我们在item中的控件并设置相应的数值即可,那么,我们也可以在ViewHolder中将引用控件并赋值的工作也完成了。如下,继续优化
1 在ViewHolder类中添加给控件赋值的方法,因为本案例都是TextView,因此代码如下:
2 修改MyAdapterWithCommonViewHolder中convert下面的代码即可
至此,我们对适配器的优化已经结束了。另外,我们可以在ViewHolder中添加对其他控件赋值的方法,本例我们只是setText给Textview赋值,我们还可以给ImageView设置图片资源,比如:
源码在这里:http://download.csdn.net/detail/hnyzwtf/9386086
我们接上篇文章,现在将建立一个通用的抽象的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
相关文章推荐
- Android打包提示Export Aborted
- Android极光推送入门
- Android Support Design Library之TabLayout
- 设计模式系列5---多变灵活的桥接
- Android中ActionBar中menu中定义的title的字体大小设置
- Android Studio快捷键
- Android 使用系统自带分享
- Android 如何解决dialog弹出时无法捕捉Activity的back事件
- Android打造listview万能适配器(上)
- android Audio 详解( 二 )
- sc7731 Android 5.1 LCD驱动简明笔记之一
- android Audio 详解( 一 )
- Android实现emoji
- Java&Android中的回调机制
- android hint 自动消失 .
- android Graphics:区域(Range)
- 【Android布局】在程序中设置android:gravity 和 android:layout_Gravity属性
- Android 版本及别名
- [Android]使用Dagger 2依赖注入 - API(翻译)
- Android Support兼容包详解使用