• Android开发RecycleView的使用全解


    RecycleView

    简介:

     RecylerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字recylerview即回收view也可以看出。

    优点及作用:

    根据官方的介绍RecylerView是ListView的升级版,既然如此那RecylerView必然有它的优点,现就RecylerView相对于ListView的优点罗列如下:

    • RecylerView封装了viewholder的回收复用,也就是说RecylerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的   逻辑被封装了,写起来更加简单。
    • 提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecylerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。例如:你想控制横向(解决了ListView只可以纵向分布的问题)或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑布流对应的还有StaggeredGridLayoutManager等),也就是说RecylerView不再拘泥于ListView的线性展示方式,它也可以实现GridView的效果等多种效果。你想控制Item的分隔线,可以通过继承RecylerView的ItemDecoration这个类,然后针对自己的业务需求去抒写代码。
    • 可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecylerView有其自己默认的实现。

     初步使用RecycleView

    首先第一步是导入v7包

    右键项目,点击Open Module Settings

    进入以下界面,点击Dependencies

    点击左下角的+符号

    点击第一项Library dependency,进入以下界面选择recycleview-v7包就行了


    acvitity_main.xml布局:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.contentprovide.liuliu.recycle_3.MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="以下是RecycleView"
            />
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/myRecycle"
            android:layout_width="wrap_content"
            android:layout_height="200dp"></android.support.v7.widget.RecyclerView>
    
    
    
    </LinearLayout>
    

    java代码实现:

    package com.contentprovide.liuliu.recycle_3;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    
    
    
    /*
    *
    * 把RecycleView添加进布局文件中
    * */
    
    
    public class MainActivity extends AppCompatActivity {
    
        //    声明一个RecycleView变量
        RecyclerView recyclerView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    //        把自定义的RecycleView变量和activity_main.xml中的id绑定
            recyclerView = (RecyclerView) findViewById(R.id.myRecycle);
    
    //        设置RecycleView的布局方式,这里是线性布局,默认垂直
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
    
    //        实例化自定义适配器
            MyAdapter myAdapter = new MyAdapter();
    
    //        把适配器添加到RecycleView中
            recyclerView.setAdapter(myAdapter);
    
        }
    
    
        //    自定义类继承RecycleView.Adapter类作为数据适配器
        class MyAdapter extends RecyclerView.Adapter {
    
            //        在适配器当中自定义内部类,其中的子对象用于呈现数据
            class Myholder extends RecyclerView.ViewHolder {
    
                TextView t;
    
                public Myholder(View view) {
                    super(view);
    
    //                实例化自定义对象
                    t = (TextView) view;
    
                }
    
    
            }
    
    //        以下是系统自动生成的三个方法
    
            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    
                Myholder myholder = new Myholder(new TextView(parent.getContext()));
    
                return myholder;
            }
    
            //        对控件赋值
            @Override
            public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    
                Myholder mm = (Myholder) holder;
    
                mm.t.setText("item" + position);
    
            }
    
            @Override
            public int getItemCount() {
                return 10;
            }
    
    
    
        }
    
    
    }
    

     实现效果

    可以看到对RecylerView的设置过程,比ListView要复杂一些,这也是RecylerView高度解耦的表现,虽然代码抒写上有点复杂,但它的扩展性是极高的。
    在了解了RecyclerView的一些控制之后,紧接着来看看它的Adapter的写法,RecyclerView的Adapter与ListView的Adapter还是有点区别的,RecyclerView.Adapter,需要实现3个方法:
    ①onCreateViewHolder()
        这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder需要我们自己去编写。直接省去了当初的convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。
    ②onBindViewHolder()
         这个方法主要用于适配渲染数据到View中。方法提供给你了一个viewHolder,而不是原来的convertView。
    ③getItemCount()
          这个方法就类似于BaseAdapter的getCount方法了,即总共有多少个条目。

    使用资源文件自定义列表项

    好多时候每个列表项我们需要展示更多的内容,并且要让它更美观,这个时候就需要自定义列表项,需要哪种效果,自己就在一个新的xml资源文件中定义

    例如实现以下效果:

    步骤:

    自定义列表项布局文件list.xml:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
    
        <TextView
            android:id="@+id/te1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="#e20707"
            android:textSize="30dp" />
    
        <TextView
            android:id="@+id/te2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="#0fec1a"
            android:textSize="15dp" />
    
    
    </LinearLayout>
    

    和上面一样的activity_main.xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.contentprovide.liuliu.recycle_4.MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="展示效果如下:" />
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/myrecycleView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView>
    
    
    </LinearLayout>
    

    Java代码实现:

    package com.contentprovide.liuliu.recycle_4;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
        RecyclerView recyclerView;
    
        String s_te1[] = {"内容一", "内容一", "内容一"};
    
        String s_te2[] = {"内容二", "内容二", "内容二"};
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            recyclerView = (RecyclerView) findViewById(R.id.myrecycleView);
    
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
    
            MyAdapter myAdapter = new MyAdapter();
    
            recyclerView.setAdapter(myAdapter);
    
    
        }
    
        class MyAdapter extends RecyclerView.Adapter {
    
            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    
    
                MyHolder myHolder = new MyHolder(LayoutInflater.from(getApplicationContext()).inflate(R.layout.list, null));//引入自定义列表项的资源文件
    
    
                return myHolder;
            }
    
            @Override
            public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
                MyHolder mm = (MyHolder) holder;
    
    //            将数据映射到控件中
                mm.te1.setText(s_te1[position]);
                mm.te2.setText(s_te2[position]);
    
            }
    
            @Override
            public int getItemCount() {
                return s_te1.length;
            }
    
            class MyHolder extends RecyclerView.ViewHolder {
    
                TextView te1, te2;
    
                public MyHolder(View itemView) {
                    super(itemView);
    
    //                实例化子对象,把对象和列表项布局文件中的id绑定
                    te1 = itemView.findViewById(R.id.te1);
                    te2 = itemView.findViewById(R.id.te2);
    
                }
    
            }
    
        }
    
    
    }
    

    到这里RecycleView的基本使用就搞定了,下面加一些更加灵活的使用,例如:增加分隔线,通过几行代码的改变转换成GridView效果。这里就可以体现RecycleView比ListView更加灵活的地方了

    将线性布局的方向由垂直改成水平,实现如下效果:

            recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));

    可以看到不止实现了水平的布局,而且可以水平滚动,这种效果在ListView中是不支持的

    将线性布局改成GridView布局

            recyclerView.setLayoutManager(new GridLayoutManager(this,4));

    网格布局默认状态下是垂直的,如果是垂直的那么第二个参数代表有多少列,如果是水平布局那么第二个参数代表的是有多少行

    转换成水平的布局:

            recyclerView.setLayoutManager(new GridLayoutManager(this,4,GridLayoutManager.HORIZONTAL,false));

    添加系统自带的分割线:

           recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));

    自定义分割线比较繁琐,有兴趣可以看看这个大神的

    http://blog.csdn.net/dmk877/article/details/50816933

  • 相关阅读:
    关于json前后台传值
    [LeetCode] #29 Divide Two Integers
    [LeetCode] #28 Implement strStr()
    [LeetCode] #27 Remove Element
    [LeetCode] #26 Remove Duplicates from Sorted Array
    [LeetCode] #25 Reverse Nodes in k-Group
    [LeetCode] #24 Swap Nodes in Pairs
    [LeetCode] #23 Merge k Sorted Lists
    [LeetCode] #22 Generate Parentheses
    [LeetCode] #21 Merge Two Sorted Lists
  • 原文地址:https://www.cnblogs.com/lyd447113735/p/8378178.html
Copyright © 2020-2023  润新知