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


    集合

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

    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

  • 相关阅读:
    R语言实战(四)回归
    nginx无法启动: libpcre.so.1/libpcre.so.0: cannot open shared object file解决办法
    nginx无法启动: libpcre.so.1/libpcre.so.0: cannot open shared object file解决办法
    nginx无法启动: libpcre.so.1/libpcre.so.0: cannot open shared object file解决办法
    nginx无法启动: libpcre.so.1/libpcre.so.0: cannot open shared object file解决办法
    Debian安装fail2ban来防止扫描
    Debian安装fail2ban来防止扫描
    Debian安装fail2ban来防止扫描
    Debian安装fail2ban来防止扫描
    字典转Json
  • 原文地址:https://www.cnblogs.com/duhuamei/p/11872873.html
Copyright © 2020-2023  润新知