集合
有了数组为什么还要集合:
- 数组是固定长度的,集合长度可变(因此,适应场景不同)
- 同时存储一对一关系的数据
- 方便增删改查
- 不能添加重复数据(如set中)
Collection |
Map |
接口 |
HashMap |
List |
Queue |
Set |
ArrayList |
LinkedList |
HashSet |
类 |
Collection存储类的对象,Map存储键值对。
List和Queue存储的对象是有序的,允许重复的,可以为null;Set中存储的对象是无序的,不允许重复的,只能有一个为null。
ArrayList
l ArrayList底层是由数组实现的
l 可以动态增长
l 列表尾部添加或删除元素效率高(在中间插入或删除元素需要移动后面的元素)
l 更适合查找或更新元素
l 元素可以为NULL
add() 插入元素
size() 查看元素个数,遍历输出元素
remove() 移除元素 (remove(“dd”)只会移除一个)
用removeAll(Collection)可以删除所有
HashSet
l Set是元素无序,并且不可以重复的集合,称为集
l HashSet是Set的一个重要的实现类
l HashSet只允许有一个Null值
l 具有良好的存取及查找性能
Iterator(迭代器)
Iterator接口可以以统一的方式对各种集合元素进行遍历
hasNext()方法检测集合中是否有下一个元素
next()返回集合中的下一个元素
如果集合的元素是自定义对象,需要重写hashCode和equals方法。参见cat类。
HashMap
Map中的数据是以键值(key-value)的形式存储的
Key-value以Entry类型的对象实例存在
可以通过key值快速地查找value
一个映射不能包含重复的键
每个键最多映射到一个值
HashMap基于哈希表的Map接口的实现;
允许使用null值和null键;
key值不允许重复;
HashMap中的Entry对象是无序排列的;
HashMap中的key不能为基本数据类型
put() 插入键值对
values() 获取值的集合
keySet() 获取键的集合
entrySet() 获取键值对集合(Entry集合)
get(key) 获取键对应的值
containsKey() 判断是否含有该key
列表类控件
AdapterView
l AdapterView继承自ViewGroup,本质是容器;
l AdapterView可包含多个“列表项”
l AdapterView包含的“列表项”由Adapter提供。调用AdapterView的setAdapter(Adapter)方法即可。
Adapter
- BaseAdapter:抽象类,实际开发中我们会继承这个类并且重写相关方法,用得最多的一个Adapter!
- ArrayAdapter:支持泛型操作,最简单的一个Adapter,只能展现一行文字。
- SimpleAdapter:同样具有良好扩展性的一个Adapter,可以自定义多种效果!
ListView
l 简单的ArrayAdapter填充ListView的例子。 BasicListViewActivity
l SimpleAdapter填充ListView的例子(自学)
l BaseAdapter填充ListView的例子(自学)
l 定制ListView界面的例子
注意: 用@android.support.annotation.NonNull 替换@androidx.annotation.Nullable
l ListView的优化
关于tags: https://developer.android.google.cn/reference/android/view/View#tags
l ListView的点击事件
setOnItemClickListener事件
setOnItemLongClickListener事件 长按事件。return false; 会继续引发Click事件。
RecyclerView
RecyclerView比ListView功能更强大更灵活。
1. 添加支持库(support library)
在build.gradle文件中添加如下代码:
dependencies {
implementation 'com.android.support:recyclerview-v7:28.0.0'
}
然后Sync
2. 向布局文件中添加RecyclerView
3. 为RecyclerView设置LayoutManager和Adapter
//获取RecyclerView控件
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
//设置布局管理器
RecyclerView.LayoutManager layoutManager=new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
//设置Adapter
RecyclerView.Adapter mAdapter = new MyAdapter(myDataset);
recyclerView.setAdapter(mAdapter);
布局管理器用于确定RecyclerView中Item的展示方式以及决定何时复用已经不可见的Item,避免重复创建以及执行高成本的findViewById()方法。
Adapter用于提供数据。
4.自定义Adapter
使用RecyclerView时,必须指定一个适配器Adapter和一个布局管理器LayoutManager。适配器继承RecyclerView.Adapter类,在Adapter中重写方法:
onCreateViewHolder(ViewGroup parent, int viewType)
onBindViewHolder(MyViewHolder holder, int position)
一个典型的Adapter:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private String[] mDataset;
//ViewHolder保存了每个item项中的所有view控件
public static class MyViewHolder extends RecyclerView.ViewHolder {
public TextView textView;
public MyViewHolder(TextView v) {
super(v);
textView = v;
}
}
// 一个构造函数 (参数类型取决于使用的数据集类型)
public MyAdapter(String[] myDataset) {
mDataset = myDataset;
}
// Create new views (invoked by the layout manager)
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// 由item_layout布局创建一个新的View
// LayoutInflater是布局填充器
TextView v =(TextView)LayoutInflater.from(parent.getContext())
.inflate(R.layout. item_layout, parent, false);
MyViewHolder vh = new MyViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
// 用当前位置的数据填充到View中的控件
holder.textView.setText(mDataset[position]);
}
@Override
public int getItemCount() {
return mDataset.length;
}
}
5. RecyclerView添加事件处理
在onBindViewHolder或onCreateViewHolder方法中对每个item的View对象设置监听事件。可以对整个item设置监听器,也可以对某个View单独设置监听器。
itemView是RecyclerView.ViewHolder的成员变量,保存item对应的整个View对象。
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(viewHolder.itemView.getContext(),"onClick " + fruit.getName(), Toast.LENGTH_LONG).show();
}
});
viewHolder.fruitImage. setOnClickListener(new View.OnClickListener() {…………
6. 定制RecyclerView
一般需要为RecyclerView进行四大设置:
² Layout Manager(必选) Item的布局
² Adapter(必选) 为Item提供数据
² Item Decoration(可选,默认为空) Item之间的Divider
² Item Animator(可选,默认为DefaultItemAnimator) 添加、删除Item动画
6.1 修改布局
² LinearLayoutManager以垂直或者水平列表方式展示Item(一维列表),效果类似ListView。
² GridLayoutManager以网格方式展示Item(二维表格),效果类似GridView。
² StaggeredGridLayoutManager以瀑布流方式展示Item(也是二维表格)
1) LinearLayoutManager
LinearLayoutManager layoutManager=new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayout.HORIZONTAL); //设置横向布局
2) GridLayoutManager
GridLayoutManager layoutManager=new GridLayoutManager(this,2);
另外:GridLayoutManager的setSpanSizeLookup方法可以设置每行显示的列数。
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
6.2 设置添加和删除item的动画
fruitsRecyclerView.setItemAnimator(new DefaultItemAnimator());
DefaultItemAnimator是默认ItemAnimator实现类,直接使用即可,这也是默认的设置。
RecyclerView官网文档:https://developer.android.google.cn/guide/topics/ui/layout/recyclerview#structure
RecyclerView详解: