安卓之各种Adapter优劣分析
文章摘要
在 Android 开发中,适配器(Adapter)是一种非常重要的设计模式,它用于将数据与视图组件进行绑定。适配器可以帮助我们在不同的视图组件(如 ListView、GridView、RecyclerView 等)中展示数据,而无需为每个组件编写重复的代码。以下是 Android 中常用的几种适配器,以及它们的适用情况、优劣分析和示例代码。
正文
ArrayAdapter
适用情况
ArrayAdapter 适用于将数据列表(如字符串数组或 List)绑定到 ListView、Spinner 等视图组件。
优势
使用简单,易于理解和使用。它可以自动为列表视图生成布局和视图。
劣势
不够灵活,不能自定义视图的样式和布局。
示例代码:
// 创建一个字符串数组
String[] data = {"Item 1", "Item 2", "Item 3"};
// 创建一个 ArrayAdapter
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, data);
// 将适配器设置为 ListView 的适配器
ListView listView = findViewById(R.id.listView);
listView.setAdapter(adapter);
SimpleCursorAdapter
适用情况
适用于简单的数据集,如Cursor查询结果。适用于将数据列表(如 Map 或 List 的集合)绑定到 ListView、GridView 等视图组件。
优点
简单易用,只需提供数据集和视图项的映射即可。
缺点
不适合大型数据集,因为它需要遍历整个数据集以查找对应的数据项。
示例代码:
java
String[] fromColumns = {DBHelper.KEY_NAME};
int[] toViews = {android.R.id.text1};
SimpleCursorAdapter adapter = new SimpleCursorAdapter(
this,
android.R.layout.simple_list_item_1,
cursor,
fromColumns,
toViews,
0
);
listView.setAdapter(adapter);
CursorAdapter
适用情况
处理大量数据,并且需要高效滚动的场景。
优点
结合了 Cursor 的优点,可以高效地处理大数据量。
缺点
定制性较弱,需要自己实现 ViewHolder 模式来提高性能。
示例代码:
java
class MyCursorAdapter extends CursorAdapter {
public MyCursorAdapter(Context context, Cursor c) {
super(context, c, FLAG_AUTO_REQUERY);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.my_row_layout, parent, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView textView = (TextView) view.findViewById(R.id.title_text_view);
textView.setText(cursor.getString(cursor.getColumnIndex("title")));
}
}
BaseAdapter
适用情况
BaseAdapter 适用于需要自定义适配器的场景,如在 ListView、GridView 等视图组件中展示复杂的数据结构。
优势
提供了更高的灵活性,可以自定义视图的样式和布局。
劣势
使用较为复杂,需要手动创建布局和视图,不如内置的 Adapter 方便。
示例代码:
public class MyAdapter extends BaseAdapter {
private Context context;
private List<String> data;
public MyAdapter(Context context, List<String> data) {
this.context = context;
this.data = data;
}
@Override
public int getCount() {
return 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) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.custom_list_item, parent, false);
}
TextView textView = convertView.findViewById(R.id.textView);
textView.setText(data.get(position));
return convertView;
}
}
// 创建一个数据列表
List<String> data = new ArrayList<>();
data.add("Item 1");
data.add("Item 2");
data.add("Item 3");
// 创建一个 MyAdapter
MyAdapter adapter = new MyAdapter(this, data);
// 将适配器设置为 ListView 的适配器
ListView listView = findViewById(R.id.listView);
listView.setAdapter(adapter);
RecyclerView.Adapter
适用情况
处理大量数据并且需要高性能滚动的场景,如在列表、网格或瀑布流布局中展示数据。
优点
高度优化,支持各种数据集和布局类型。
缺点
需要熟悉 RecyclerView 的使用方法,学习成本稍高。但是,由于RecyclerView的使用日益普遍,很多开发者和库已经提供了可重用的适配器实现,例如Google提供的StaggeredGridLayoutManager和GridLayoutManager等。
示例代码:
class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> {
private List<String> data;
public MyRecyclerViewAdapter(List<String> data) {
this.data = data;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_row_layout, parent, false);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.textView.setText(data.get(position));
}
@Override
public int getItemCount() {
return data.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public ViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.title_text_view);
}
}
}
// 创建一个数据列表
List<String> data = new ArrayList<>();
data.add("Item 1");
data.add("Item 2");
data.add("Item 3");
// 创建一个 MyAdapter
MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(data);
// 将适配器设置为 RecyclerView 的适配器
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
PagerAdapter
PagerAdapter是Android开发中一个关键的组件,主要用于填充和管理ViewPager中的页面。作为ViewPager的适配器,PagerAdapter的主要作用是将多个页面绑定到一起,实现连续滑动的效果。根据不同的场景和需求,我们可以选择不同类型的适配器,如 FragmentPagerAdapter、FragmentStatePagerAdapter 和 PagerAdapter。
适用情况
需要实现滑动切换效果的应用,如图片轮播、新闻阅读等。
当应用中包含大量的页面数据,并且需要高效地管理和显示这些数据时,例如电商平台的商品列表、社交应用的消息列表等。
优点
能够管理大量页面数据:当需要展示的页面数量较多时,PagerAdapter可以提供很好的支持。
强大的页面切换和滑动效果:借助于ViewPager控件,PagerAdapter可以实现用户所期待的流畅滑动效果。
灵活的局部更新:当只有部分页面内容发生变化时,PagerAdapter可以进行局部刷新,提高应用性能。
缺点
复杂的使用方法:PagerAdapter的使用相对复杂,需要覆盖特定的方法并处理生命周期等细节。
性能问题:在处理大量数据或复杂布局时,PagerAdapter的性能可能会受到影响。
示例代码
public class MyPagerAdapter extends PagerAdapter {
private List<View> views;
public MyPagerAdapter(List<View> views) {
this.views = views;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = views.get(position);
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public int getCount() {
return views.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
List<Fragment> fragments = new ArrayList<>();
// 填充 fragments 列表
MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager(), fragments);
ViewPager viewPager = findViewById(R.id.view_pager);
viewPager.setAdapter(adapter);
总结
总的来说,选择哪种 Adapter 主要取决于你的具体需求和应用场景。例如,如果你只是想快速展示一些静态数据,那么 ArrayAdapter 可能就足够了。但是,如果你需要处理大量的动态数据,那么 RecyclerView.Adapter 可能是更好的选择。无论你选择哪种 Adapter,都应该注意适当地管理和更新数据源,以确保界面的正确显示。
安卓之各种Adapter优劣分析的更多相关文章
- spark和strom优劣分析
对于Storm来说:1.建议在那种需要纯实时,不能忍受1秒以上延迟的场景下使用,比如实时金融系统,要求纯实时进行金融交易和分析2.此外,如果对于实时计算的功能中,要求可靠的事务机制和可靠性机制,即数据 ...
- 安卓app测试之Monkey日志分析《转载》
安卓app测试之Monkey日志分析 链接:https://www.cnblogs.com/wuzm/p/10965762.html
- 小白学习mysql之存储过程的优劣分析以及接入控制
存储过程的优劣 存储过程是一组实现特定功能的SQL语句集合,存储过程一经编译便存储在了服务器上,可以通过调用存储过程的名字以及传入相应的参数来使用存储过程.要高层次的掌握存储过程,不能觉得依葫芦画瓢, ...
- Clock Crossing Adapter传输效率分析 (Latency增加,传输效率降低)
原创By DeeZeng [ Intel FPGA笔记 ] 在用Nios II测试 DDR3时候发现一个现象 (测试为:写全片,读全片+比对) 用单独的PLL产生时钟(200MHz)驱动 Nios I ...
- SQLServer自带备份优劣分析
众所周知, SQL Server自身的"维护计划"可以实现自动备份数据库. 既然这样,那还有必要使用第三方专业备份软件吗? 本文以[护卫神·好备份专业版]为例,分析两者之间的优劣. ...
- 安卓Listview和Adapter数据设计
ListView是一种用于垂直显示的列表控件,如果显示内容过多,则会自动出现垂直滚动条,每一行是一个View对象,在每一行上可以放置任何组件,Adapter适配器是数据和UI的桥梁,为数据显示提供了统 ...
- 地区picker 各选择器,优劣分析
移动端选择器picker有很多,各大ui组件都有自己的picker,比如light7,HUI,MUI,jqueryUI等等.但是,我发现他们都有各种各样的问题.这次的地区选择,需要地区的省份+市+经纬 ...
- JAVA之多线程概念及其几种实现方法优劣分析
1. 多线程 程序:指令集,静态的概念 进程:操作系统调动程序,是程序的一次动态执行过程,动态的概念 线程:在进程内的多条执行路径 Ps:单核的话进程都是虚拟模拟出来的,多核处理器才可以执行真正的多线 ...
- 安卓app测试之Monkey日志分析
转:原文:https://blog.csdn.net/a136332462/article/details/76066909 一.一般测试结果分析-搜索关键字: 1.无响应问题可以在日志中搜索 “A ...
- Dedecms手机站三种不同建设方法和优劣分析
dedecms简单易用功能强大,是国内使用最多的cms建站系统,百度站长平台专门推出了“织梦移动化指南”,由此可见dedecms的影响力.织梦也是站长使用和学习最早的cms建站系统,解放了我的双手,让 ...
随机推荐
- 文心一言 VS 讯飞星火 VS chatgpt (84)-- 算法导论8.2 1题
一.用go语言,参照图8-2 的方法,说明 COUNTING-SORT 在数组 A=(6,0,2,0,1,3,4,6,1,3,2)上的操作过程. 文心一言: Counting Sort 是一种非比较型 ...
- WPF学习 - 动画基础(2)
上一篇文章粗略的介绍了一下Animation类.本篇介绍一下Storyboard. Storyboard,姑且翻译成"故事板"吧.实际上它是一个Animation对象的容器,可以容 ...
- [编程基础] Python内置模块collections使用笔记
collections是Python标准库中的一个内置模块,它提供了一些额外的数据结构类型,用于增强Python基础类型如列表(list).元组(tuple)和字典(dict)等.以下是对collec ...
- 入门篇-其之二-Java基础知识
目录 对第一个Java程序的思考 外层结构--类 内层结构--main方法 输出语句 注释 单行注释 多行注释 文档注释 文档注释常用标签 使用javadoc命令生成网页风格的文档 阿里巴巴Java开 ...
- Vue3+vite路由配置优化(自动化导入)
今天在维护优化公司中台项目时,发现路由的文件配置非常多非常乱,只要只中大型项目,都会进入很多的路由页面,规范一点的公司还会吧路由进行模块化导入,但是依然存在很多文件夹的和手动导入的问题. 于是我想到了 ...
- 【ChatGPT-应用篇】基于chatGPT覆盖测试过程的初步探索
1.前言 22年底ChatGPT就已风靡行业内外,简单来说,它是基于自然语言生成式 AI 模型,打造的一款聊天机器人.是 OpenAI 于 11 月 30 日推出的最新作品,供公众免费测试.他可以根据 ...
- Vue 脚手架编程
1.1 初始化脚手架 1.1.1 说明 Vue 脚手架是 Vue 官方提供的标准化开发工具(开发平台) 最新的版本是 4.x 文档 1.1.2 具体步骤 第一步(仅第一次执行):全局安装 @vue/c ...
- 「codeforces - 1621G」Weighted Increasing Subsequences
link. 一个 dp(拜谢 ly)和切入点都略有不同的做法,并不需要观察啥性质. 原问题针对子序列进行规划,自然地想到转而对前缀进行规划.接下来我们考虑一个前缀 \([1, i]\) 以及一个 \( ...
- k8s work节点无法使用kubectl命令
在Kubernetes的node节点上运行命令 [ kubectl ] 命令出现了如下错误 root@calico-work01:~# kubectl get nodes The connection ...
- k8s1.25版本上实践 Ingress-nginx
背景: 领导要求的最新最新版本k8s...使用ingress-nginx 对外暴露内部服务 环境 节点 master worker 主机/ip calico-master01/192.168.195. ...