您的位置:首页 > 其它

安卓开发笔记——打造万能适配器(Adapter)

2015-04-18 17:01 375 查看
为什么要打造万能适配器?

在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需要,因此我们时常要去继承BaseAdapter类去实现一个自定义的适配器来满足我们的场景需要。

如果你是开发一个简单点的APP还好,可能ListView和GridView的数量不会太多,我们只要去写几个BaseAdapter实现类就可以了。

但如果有一天,你需要开发一个APP里面具有几十个ListView或者GridView的子页面,此时的你该怎么办?每个ListView或者GridView都去写一个适配的Adatper类吗?

当然你如果想做蛮牛不嫌累的话也不是不可以,但如果有办法可以让自己减少很多工作量,避免做重复无意义劳动,何乐而不为呢?

万能适配器思想?

软件设计模式:模板方法模式(有兴趣了解的朋友,可以参考看下我之前写过的博文《软件设计模式之模板方法模式(JAVA)》)

其实解决问题的核心思想很简单,一句话:抽取重复代码!

我们在继承BaseAdapter类时,都需要去实现它里面的抽象方法(
getCount, getItem, getItemId, getView
),其中除了getView这个方法里需要实现的代码不同,其他的都一样。

而这个getView方法里,我们考虑到性能的问题,我们经常会引入一个ViewHolder类(关于不清楚ViewHolder的朋友可以看看我之前写过的博文《安卓开发笔记——ListView加载性能优化ViewHolder》),尽可能的去节省资源。

那么解决问题的思路就出来了,我们可以把这个适配器抽取成2部分:

第一部分是解决(getCount, getItem, getItemId)方法里重复代码的问题。

第二部分是分离getView方法里使用到的ViewHolder,把它单独抽取出来成一个独立的类,利用键值对Key=>Value的方法,以控件ID去寻找对应的View对象。

如果你看完以上这些感觉已经云里来雾里去,没关系,接下去我们用代码说话。

传统适配器的实现方式:

package com.example.listviewtest;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

public class MainActivity extends Activity {

private ListView listView;
private MyAdapter adapter;
private List<User> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化
listView=(ListView) findViewById(R.id.listview);
list=new ArrayList<User>();

//模拟数据源
for(int i=0;i<10;i++){
User user=new User();
user.setName("用户"+i);
user.setPhone("10000"+i);
list.add(user);
}

adapter=new MyAdapter(MainActivity.this, list,R.layout.listview_item);

listView.setAdapter(adapter);

}

}


View Code
就像这样,以后如果需要使用适配器Adapter就不需要再去继承BaseAdapter了,直接继承CommonAdapter配合CommonViewHolder就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: