第02讲集合类和列表类控件

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-04 16:08:23

集合

有了数组为什么还要集合:

  1. 数组是固定长度的,集合长度可变(因此,适应场景不同)
  2. 同时存储一对一关系的数据
  3. 方便增删改查
  4. 不能添加重复数据(如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

简单的ArrayAdapter填充ListView的例子。  BasicListViewActivity

SimpleAdapter填充ListView的例子(自学)

BaseAdapter填充ListView的例子(自学)

定制ListView界面的例子

注意: 用@android.support.annotation.NonNull 替换@androidx.annotation.Nullable

ListView的优化

关于tags: https://developer.android.google.cn/reference/android/view/View#tags

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方法可以设置每行显示的列数。

官网:https://developer.android.google.cn/reference/kotlin/androidx/recyclerview/widget/GridLayoutManager?hl=en#top_of_page

3) StaggeredGridLayoutManager

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详解:

https://www.jianshu.com/p/4f9591291365

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!