9.代码抽取(adapter)


1 抽取Adapter 共性的方法
2 把getView方法里 和holder相关的逻辑 摘取到Holder代码中
3 把Holder 相关的代码 抽取到BaseHolder中
4 把adapter 中getVIew 方法 抽取到了DefaultAdpater中, 其中每个子类getView方法中holder不太一样,所以定义了抽象方法getHolder 要求子类去实现holder
- BaseHolder 所有holder的基类
- DefaultAdapter 所有adapter 的基类
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();
}
子类只需要填充数据和设置控件显示的数据就可以
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();
}
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;
}
}
}
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)的更多相关文章
- Java Web项目中的经典代码抽取
前言: 众所周知的,项目开发中做得最多的无非就是增删查改(CRUD)操作.自从国内Web项目开发渐渐盛行SSH框架之后,其开发开发流程也变得更加灵活:本文就项目开发中的业务层代码作个简单的抽取,供业内 ...
- 非代码抽取的dex加固脱壳
常见的非代码抽取的dex加固,可以通过修改或者hook源码中的dex解析函数拿到目标dex完成脱壳.该dex解析函数为DexFile* dexFileParse(const u1* data, siz ...
- Thymeleaf静态资源引入方式及公共页面代码抽取
静态资源引入 Thymeleaf模板引擎url问题,要用如下的方式写,确保在任何情况下都能访问到 <!-- Bootstrap core CSS --> <link href=&qu ...
- mybatis公用代码抽取到单独的mapper.xml文件
同任何的代码库一样,在mapper中,通常也会有一些公共的sql代码段会被很多业务mapper.xml引用到,比如最常用的可能是分页和数据权限过滤了,尤其是在oracle中的分页语法.为了减少骨架性代 ...
- 如何在eclips下将一段代码抽取为方法Extract Method
最近读了读关于重构的文章,做了个小总结(在编程思想目录下<从文章"避免复制与粘贴"到文章"Extract Method"的反思 系列>). 然后因为 ...
- 优雅的实现多类型列表的Adapter
1引言 在开发中经常会遇到,一个列表(RecyclerView)中有多种布局类型的情况.前段时间,看到了这篇文章 [译]关于 Android Adapter,你的实现方式可能一直都有问题(http:/ ...
- Android Studio在代码重构中的妙用
代码重构几乎是每个程序员在软件开发中必须要不断去做的事情,以此来不断提高代码的质量.Android Stido(以下简称AS)以其强大的功能,成为当下Android开发工程师最受欢迎的开发工具,也是A ...
- 设计模式-Java版-全-附代码-超生动实例
阅读推荐:设计模式-简单篇 项目地址:https://gitee.com/zwtgit/gof23 学习网站推荐: https://refactoringguru.cn/design-patterns ...
- [工作中的设计模式]适配器模式adapter
一.模式解析 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 也就是说,如果已经写好了一个接口,但是又来了一种截然不同的接口,如 ...
随机推荐
- CentOS7下开放端口
memcached等服务启动后,外网默认是无法访问的,因为防火墙不允许,所以要开启防火墙,让其可以访问这些端口号. 方法一:使用firewall 1.运行命令:firewall-cmd --get-a ...
- mysql学习记录
干净卸载mysql:https://blog.csdn.net/cxy_summer/article/details/70142322mysql 解压缩版安装说明:https://jingyan.ba ...
- 关于webservlet 请求异步处理,链接未关闭出现的bug
webservlet +redis 的消息发布订阅 ,挺好的 当请求到来,向redis server申请一个频道 ,然后等着另一端架设是B 处理完毕获得到处理信息调用redis ,使用redis 往 ...
- 7C - 折线分割平面
我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示. Input ...
- 构造一个String类
#include "stdafx.h" #include<iostream> #include<string.h> using namespace std; ...
- 创建服务的注册与发现 Eureka (四)
一.eureka注册中心 1.创建一个工程 工程名:microservicecloud-eureka-7001 2.向pom文件中增加如下: <dependencies> <!--e ...
- webpack 打包问题
Project is running at http://localhost:8080/webpack output is served from /dist/webpack: wait until ...
- Docker 容器连接
前面我们实现了通过网络端口类访问运行在 diocker 容器内的服务.下面我们来实现通过端口连接到了一个 dokcer 容器. 网络端口映射 我们创建一个python应用的容器. runoob@run ...
- nginx集成环境下载
https://visual-nmp.en.softonic.com/download
- sqlserv 配置 CLR
转载地址:http://www.cnblogs.com/Brambling/p/8000911.html //clr 配置 https://docs.microsoft.com/zh-cn/sql ...