1  抽取Adapter 共性的方法

2  把getView方法里 和holder相关的逻辑 摘取到Holder代码中
3  把Holder 相关的代码 抽取到BaseHolder中 
4  把adapter 中getVIew 方法 抽取到了DefaultAdpater中, 其中每个子类getView方法中holder不太一样,所以定义了抽象方法getHolder 要求子类去实现holder

  • BaseHolder 所有holder的基类
  • DefaultAdapter 所有adapter 的基类
BaseHolder
public abstract class BaseHolder<T> {
protected View contentView;
protected T data;
public BaseHolder(){
contentView=initView();
contentView.setTag(this); // 在这个位置设置的标签
} public void setData(T data) {
this.data=data;
refreshView(data);
}
/**
* 当Holder中的view对象显示到界面上的时候调用,即getview返回这个
* @return
*/
public View getContentView() {
return contentView;
}
/**
* 当setData调用的时候 会调用该方法 根据数据 显示界面
*/
protected abstract void refreshView(T data);
/**
* 初始化View对象 及其控件
* @return
*/
protected abstract View initView();
}
子类只需要填充数据和设置控件显示的数据就可以

  

DefaultAdapter
public abstract class DefaultAdapter<T> extends BaseAdapter {
private List<T> datas;
public DefaultAdapter(List<T> datas){
this.datas=datas;
}
@Override
public int getCount() {
return datas.size();
}
@Override
public Object getItem(int position) {
return datas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
//convertView 划出屏幕的view对象
@Override
public View getView(int position, View convertView, ViewGroup parent) {
BaseHolder<T> holder;//和adapter的泛型一样
if(convertView==null){
holder=getHolder();
}else{
holder=(BaseHolder<T>)convertView.getTag();
}
T string = datas.get(position);
//holder.refreshView(string);
holder.setData(string); return holder.getContentView();
}
protected abstract BaseHolder<T> getHolder();
}
MainActivity
public class MainActivity extends Activity {
private ListView lv;
private List<String> datas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
datas=new ArrayList<String>();
for(int i=0;i<100;i++){
datas.add("aabbbcc"+i);
} lv=(ListView) findViewById(R.id.lv);
lv.setAdapter(new MainAdapter(datas)); }
public void click(View v){
Intent intent=new Intent(getApplicationContext(), SecondActivity.class);
startActivity(intent); } private class MainAdapter extends DefaultAdapter<String>{
public MainAdapter(List<String> datas) {
super(datas);
// TODO Auto-generated constructor stub
}
@Override
protected BaseHolder<String> getHolder() {
return new MainHolder();
} }
class MainHolder extends BaseHolder<String>{
private TextView tv;
// 在adapter里list.get(position),然后调用了holer的setdate,而setdata调用了refresh,这样就把data传过来了
@Override
protected void refreshView(String data) {
this.tv.setText(data);
}
@Override
protected View initView() {
View view=View.inflate(getApplicationContext(), R.layout.item_main, null);
this.tv=(TextView) view.findViewById(R.id.tv);
return view;
}
}
}

  

SecondActivity
public class SecondActivity extends Activity {
private ListView lv_second;
private List<Drawable> datas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
lv_second=(ListView) findViewById(R.id.lv_second);
datas=new ArrayList<Drawable>();
for(int i=0;i<100;i++){
Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
datas.add(drawable);
} lv_second.setAdapter(new SecondAdapter(datas));
}
private class SecondAdapter extends DefaultAdapter<Drawable>{
public SecondAdapter(List<Drawable> datas) {
super(datas);
}
@Override
protected BaseHolder<Drawable> getHolder() {
return new SecondHolder();
}
}
class SecondHolder extends BaseHolder<Drawable>{ ImageView iv;
@Override
protected void refreshView(Drawable data) {
iv.setImageDrawable(data);
}
@Override
protected View initView() {
View view=View.inflate(getApplicationContext(), R.layout.item_second, null);
this.iv=(ImageView) view.findViewById(R.id.iv);
return view;
} }
}

  

9.代码抽取(adapter)的更多相关文章

  1. Java Web项目中的经典代码抽取

    前言: 众所周知的,项目开发中做得最多的无非就是增删查改(CRUD)操作.自从国内Web项目开发渐渐盛行SSH框架之后,其开发开发流程也变得更加灵活:本文就项目开发中的业务层代码作个简单的抽取,供业内 ...

  2. 非代码抽取的dex加固脱壳

    常见的非代码抽取的dex加固,可以通过修改或者hook源码中的dex解析函数拿到目标dex完成脱壳.该dex解析函数为DexFile* dexFileParse(const u1* data, siz ...

  3. Thymeleaf静态资源引入方式及公共页面代码抽取

    静态资源引入 Thymeleaf模板引擎url问题,要用如下的方式写,确保在任何情况下都能访问到 <!-- Bootstrap core CSS --> <link href=&qu ...

  4. mybatis公用代码抽取到单独的mapper.xml文件

    同任何的代码库一样,在mapper中,通常也会有一些公共的sql代码段会被很多业务mapper.xml引用到,比如最常用的可能是分页和数据权限过滤了,尤其是在oracle中的分页语法.为了减少骨架性代 ...

  5. 如何在eclips下将一段代码抽取为方法Extract Method

    最近读了读关于重构的文章,做了个小总结(在编程思想目录下<从文章"避免复制与粘贴"到文章"Extract Method"的反思 系列>). 然后因为 ...

  6. 优雅的实现多类型列表的Adapter

    1引言 在开发中经常会遇到,一个列表(RecyclerView)中有多种布局类型的情况.前段时间,看到了这篇文章 [译]关于 Android Adapter,你的实现方式可能一直都有问题(http:/ ...

  7. Android Studio在代码重构中的妙用

    代码重构几乎是每个程序员在软件开发中必须要不断去做的事情,以此来不断提高代码的质量.Android Stido(以下简称AS)以其强大的功能,成为当下Android开发工程师最受欢迎的开发工具,也是A ...

  8. 设计模式-Java版-全-附代码-超生动实例

    阅读推荐:设计模式-简单篇 项目地址:https://gitee.com/zwtgit/gof23 学习网站推荐: https://refactoringguru.cn/design-patterns ...

  9. [工作中的设计模式]适配器模式adapter

    一.模式解析 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 也就是说,如果已经写好了一个接口,但是又来了一种截然不同的接口,如 ...

随机推荐

  1. windows -休眠

    查询服务器执行的睡眠状态 powercfg -a 开始休眠方法:手工键入如下命令: powercfg -hibernate on 命令执行之后立即就可以生效,无需要重新启动系统,再次执行“powerc ...

  2. python websocket 客户端连接

    # -*- coding: utf-8 -*-import jsonimport websocketimport _thread as thread # try:# import thread# ex ...

  3. Lonsdor K518ISE programs 2005 Ford Focus key in two minutes

    A quick demonstration of Lonsdor K518ISE programming key for 2005 Ford Focus in two minutes. And for ...

  4. 分享一个mac for redis-desktop-manager破解版安装包

    链接: https://pan.baidu.com/s/1BDndGmBlWoSr4hVLpF3FVw  提取码: wwir

  5. 【Java】a++,++a 区分记忆

    写了个例子测试: package com.xdsux.java.basetest; public class BaseTest1 { public static void main(String[] ...

  6. 2-创建spring boot项目

    想要创建一个spring boot项目,最好的方法就是参照官网的例子: https://spring.io/guides/gs/maven/#scratch 创建的过程我就不再啰嗦了,官网描述非常详细 ...

  7. sql_calc_found_rows原理

  8. sql语句创建数据表

    unsigned 数值类型 无符号化 AUTO_INCREMENT 自增长 PRIMARY KEY 唯一主键 COMMENT 备注信息 BIT 类型只有1和0两个值 enum 枚举数值类型 UNIQU ...

  9. Day08 (黑客成长日记) 命名空间和作用域

    Day08:命名空间和作用域: 1.命名空间: (1)内置命名空间(python解释器): 就是python解释器一旦启动就可以使用的名字储存在内置命名空间中: eg: len() print() a ...

  10. asp.net 抽象方法和虚方法的用法区别,用Global类重写Application_BeginRequest等方法为例子

    不废话,直接贴代码 public abstract class LogNetGlobal : System.Web.HttpApplication { protected void Applicati ...