在上一篇中,我们说过,在setData中如果有很多控件的话,我们还是要在该方法中写入很多代码,为了降低开发的方便性,本次就在此基础上再一次优化。实现原理是这样的,每次在setData中都要查找控件,然后setXXX()什么的,我们可以把这写实现放如到ViewHolder中去,在ViewHolder中写入一个链式的方法,来帮助我们来实现功能(关于ViewHodler类的代码我就不再重复写了,代码在此:Android之自定义实现BaseAdapter(通用适配器一) ),链式方法如下:

public ViewHolder setText(int viewId, String data){

TextView tv = getView(viewId);

tv.setText(data);

return this;

}

通过这个方法,我们可以很好的去设置对应的内容,只需要传一个需要设置控件的id,然后传对应的数据,就可以达到设置文字的效果了,下面再看看我们的MyAdapter.java中的代码

MyAdapter.java

/**

* 上一篇中的MyAdapter

*/

public class MyAdapter extends MyBaseAdapter {

public MyAdapter(List data) {

super(data);

}

@Override

public void setData(ViewHolder holder, Student t) {

TextView tvName = holder.getView(R.id.mTv1);

tvName.setText(t.getName());

TextView tvSex = holder.getView(R.id.mTv2);

tvSex.setText(t.getSex());

}

}

/**

* 优化后的MyAdapter

*/

public class MyAdapter extends MyBaseAdapter {

public MyAdapter(List data) {

super(data);

}

@Override

public void setData(ViewHolder holder, Student t) {

holder.setText(R.id.mTv1, t.getName()).setText(R.id.mTv2, t.getSex());

}

}

ok,对比一下setData中的实现,我们这里只用一条代码就可以代替上面的实现了,这样是不是更方便呢,这样的话,我们的扩展就更加方便了,如果说,我们不仅仅只是设置文本内容,而是通过图片控件设置图片呢?很简单,我们只需要在ViewHolder中再添加我们要实现的方法即可,比如设置图片,我们可以添加如下代码:

public ViewHolder setImageResource(int viewId,int resId){

ImageView img = getView(viewId);

img.setImageResource(resId);

return this;

}

public ViewHolder setImageBitmap(int viewId, Bitmap bm){

ImageView img = getView(viewId);

img.setImageBitmap(bm);

return this;

}

添加这两个方法后,需要设置图片就很轻松了,只需在setData中传递对应的参数即可

@Override

public void setData(ViewHolder holder, Student t) {

holder.setText(R.id.mTv1, t.getName()).setText(R.id.mTv2, t.getSex());

holder.setImageResource(R.id.img1,资源id).setImageBitmap(R.id.img2,bm);

}

好了,一个通用的适配器就已经完成了,整体框架和代码都已经实现了,我将所有的代码都综合一下,写在下面,方便大家使用,分别是MainActivity.java(主界面类,负责传参设置ListView的数据)、MyAdapter.java(自定义的适配器)、MyBaseAdapter.java(通用的适配器类)、ViewHolder.java(通用的持有类对象)、以及实体类Student.java

MainActivity.java

public class MainActivity extends AppCompatActivity{

private List data;

private ListView mList;

MyAdapter adapter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

getData();

mList = (ListView) findViewById(R.id.mList);

adapter = new MyAdapter(data);

mList.setAdapter(adapter);

}

private void getData() {

data = new ArrayList<>();

Student stu = null;

for (int i = 0; i < 20; i++) {

stu = new Student();

stu.setName("姓名" + i);

stu.setSex(i % 2 == 0 ? "男" : "女");

data.add(stu);

}

}

}

MyAdapter.java

public class MyAdapter extends MyBaseAdapter {

public MyAdapter(List data) {

super(data);

}

@Override

public void setData(ViewHolder holder, Student t) {

holder.setText(R.id.mTv1, t.getName()).setText(R.id.mTv2, t.getSex());

}

}

MyBaseAdapter.java

public abstract class MyBaseAdapter extends BaseAdapter {

protected List data;

public MyBaseAdapter(List data){

this.data = data;

}

@Override

public int getCount() {

return data == null ? 0 : data.size();

}

@Override

public Object getItem(int position) {

return data.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder = ViewHolder.getHolder(convertView,parent,position, R.layout.list_item);

setData(holder,data.get(position));

return holder.getConvertView();

}

public abstract void setData(ViewHolder holder,T t);

}

ViewHolder.java

public class ViewHolder {

private int position;

private SparseArray array;

private View convertView;

private Context context;

private ViewHolder(ViewGroup parent, int position, int layout) {

this.position = position;

this.context = parent.getContext();

convertView = LayoutInflater.from(parent.getContext()).inflate(layout, null);

convertView.setTag(this);

array = new SparseArray<>();

}

public static ViewHolder getHolder(View convertView, ViewGroup parent, int position, int layout) {

if (convertView == null) {

return new ViewHolder(parent, position, layout);

} else {

ViewHolder holder = (ViewHolder) convertView.getTag();

holder.position = position;

return holder;

}

}

public T getView(int viewId) {

View view = array.get(viewId);

if (view == null) {

view = convertView.findViewById(viewId);

array.put(viewId, view);

}

return (T) view;

}

public View getConvertView() {

return convertView;

}

public ViewHolder setText(int viewId, String data) {

TextView tv = getView(viewId);

tv.setText(data);

return this;

}

public ViewHolder setImageResource(int viewId, int resId) {

ImageView img = getView(viewId);

img.setImageResource(resId);

return this;

}

public ViewHolder setImageBitmap(int viewId, Bitmap bm) {

ImageView img = getView(viewId);

img.setImageBitmap(bm);

return this;

}

}

Student.java

public class Student {

private String name;

private String sex;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android怎么设置适配器,Android之自定义实现BaseAdapter(通用适配器三)相关推荐

  1. 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/374.html L ...

  2. android datepicker设置日期,Android DatePicker

    前言 话说日期时间选择控件许多项目都会用到,今天小可不才,也发一个自己写的日期选择控件 先上图 CC8V2$(JPZ`{WT42ICK7F}K.png demo.gif 1.首先自定义日期选择工具类 ...

  3. android 动态设置padding,Android动态设置控件大小以及设定margin以及padding值

    http://www.aichengxu.com/Java/73893.htm Android动态设置控件大小以及设定margin以及padding值,有需要的朋友可以参考下. 一.概述 在andro ...

  4. android remoteviews 设置背景,Android通过RemoteViews实现跨进程更新UI示例

    一.概述 前面一篇文章Android通过AIDL实现跨进程更新UI我们学习了aidl跨进程更新ui,这种传统方式实现跨进程更新UI是可行的,但有以下弊端: View中的方法数比较多,在IPC中需要增加 ...

  5. android如何设置图标,Android APP如何设置显示图标

    一款APP的图标是它的脸面,颜值的重要性,不言而喻了.接下来,如何设置APP的图标? 步骤1.编辑 AndroidManifest.xml: package="test.applicatio ...

  6. android+动态设置权重,Android自适应布局(关于权重weight的使用技巧!)

    weight和weightSum Layout Weight LinearLayout also supports assigning a weight to individual children ...

  7. android 状态栏设置工具栏,Android状态栏工具

    参考了一些文章做了一些修改,变成了自己的工具类.其中有很多地方欠考虑,有待改进,欢迎路过的大佬给点建议. 经过前两篇的介绍我们对如何修改状态栏的效果有了大致的了解,本篇介绍一种使用更加简单的方式 设置 ...

  8. android imageview设置边框,android ImageView 添加边框

    有两种方法可以给ImageView添加边框,一种是通过xml文件配置shape.另一种是重写ImageView的ondraw方法,这里用第二中方法: package org.example.image ...

  9. android 代码设置圆角,Android中用Shape实现圆角和局部圆角

    本文讲解如何实现布局边框的部分圆角 大家可能都知道圆角实现其实很简单, 在drawable文件夹下新建xml文件加入以下代码 情景1: 四个角均为圆角 android:shape="rect ...

  10. android 铃声设置失败,Android铃声设置错误

    点击按钮运行set_ringtone.没有错误,它设置铃声.但是当我第二次点击按钮时,出现错误.Android铃声设置错误 public void set_ringtone(Context conte ...

最新文章

  1. 自动发邮件的程序 c语言,5分钟!教你用C语言发送邮件:附送源码+教学!
  2. 真正实时随机数的实现C++ _timeb _ftime(转)
  3. 三. 自动化测试用例设计
  4. CV Code | 本周计算机视觉新出开源代码汇总(含医学图像分割、神经架构搜索、姿态迁移、超分辨率等)...
  5. java国王毒酒答案,换换脑子500桶酒国王用囚犯找毒酒答案-500桶酒其中1桶是毒酒找毒酒答案最新版【附公式详解】-东坡下载...
  6. c++向量和数组的区别_Matlab入门基础知识(5)对数组的操作
  7. log4j不打印日志
  8. 普惠AI,将是开发者下一个风口吗?看看他们怎么说
  9. Android Handler机制之总目录
  10. 公式推导以及仿真代码的修改 11-28
  11. IDEA 打包忽略测试
  12. 微软代码审查工具_微软代码审查的工作方式
  13. Processing学习笔记
  14. 全球航天电机行业调研及趋势分析报告
  15. 网页爬虫1--正则表达式
  16. 苹果公司欲使用3D打印技术进行新产品的测试
  17. 基于多阈值的形态提取遥感图像中的沿海线的特征方法(Qu Jishuang)
  18. 借游戏带动“卖铲”收益,“卖铲子”的Unity借元宇宙起飞?
  19. 学生宿舍管理系统之概念结构设计
  20. 浅析SFX脚手架源码

热门文章

  1. wxpython富文本_去除富文本编辑器中的标签
  2. BugkuCTF-MISC题善用工具
  3. 计算机控制系统的闭环复极点,计算机控制 第四章 2.ppt
  4. 微型计算机可避免强磁场干扰,微型计算机测控系统抗干扰技术
  5. python问卷调查系统设计案例_从设计到施工,全面剖析超级玻璃屋面系统案例!...
  6. mysql sum id 5_mysql怎么使用sum()求id字段的和?
  7. linux中控和安卓中控哪个比较好,原厂中控和改装中控有什么区别?哪个更好?...
  8. 龙贝格数值分析作业c语言,数值分析龙贝格实验报告.doc
  9. 里能嵌jquery吗_白芸豆里的淀粉阻断成分,能帮助减肥是真的吗?
  10. starops 云效运维 文档_阿里云 SAE 携手云效助力「石家庄掌讯」持续交付、降本提效...