美文网首页Android基础
Android中RecyclerView配合BaseRecycl

Android中RecyclerView配合BaseRecycl

作者: 马木木_1991 | 来源:发表于2018-11-11 18:08 被阅读90次
    熟练使用RecyclerView是Android开发工程师必备的技能之一。今天来教大家如何简单使用他。

    说明:

    一,使用的Androidstudio版本为3.1.3

    二,RecyclerView都是配合adapter一起使用的,有个好的适配器会使recyclerView使用起来事半功倍。我使用的是github上的一个开源适配器的项目。

    github地址为:https://github.com/CymChad/BaseRecyclerViewAdapterHelper
    对应的简书说明地址为:https://www.jianshu.com/p/b343fcff51b0

    展示效果:

    sp_1.GIF

    现在正式开始

    1,在build.gradle中做如下代码1,2两步骤所示配置。

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 27
        defaultConfig {
            applicationId "com.mumu.jsrecyclerview1"
            minSdkVersion 15
            targetSdkVersion 27
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    //1,增加jitpack支持
    allprojects {
        repositories {
            maven { url "https://jitpack.io" }
            maven { url "https://maven.google.com" }
            flatDir {
                dirs 'libs'
            }
        }
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'com.android.support:appcompat-v7:27.1.1'
        implementation 'com.android.support.constraint:constraint-layout:1.1.3'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'com.android.support.test:runner:1.0.2'
        androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    
        //butterKnife
        implementation 'com.jakewharton:butterknife:8.8.1'
        annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
    
        //2,增加recyclerView和对应的适配器
        implementation 'com.android.support:recyclerview-v7:27.1.1'
        implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'
    }
    
    

    2,为recyclerView的子列表自定义布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="95dp"
        android:background="#f8f8f8"
        android:orientation="vertical"
        android:paddingLeft="15dp"
        android:paddingRight="15dp">
    
        <TextView
            android:id="@+id/test_item_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="我爱小狗"
            android:textColor="#333333"
            android:textSize="16sp" />
    
        <TextView
            android:id="@+id/test_item_message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/test_item_title"
            android:layout_marginTop="10dp"
            android:ellipsize="end"
            android:maxLines="2"
            android:text="我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗"
            android:textColor="#999999"
            android:textSize="14sp" />
    </LinearLayout>
    
    

    3.1,一般我们的数据都是从后台数据库通过接口拿取的,一般的返回格式如下

    {
    
        "Success":true,
    
        "StatusCode":200,
    
        "Result": {
    
            "list": [{
    
                "TestTitle":"我爱小狗",
    
                "TestNessage":"我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗"
    
            }, {
    
                "TestTitle":"我爱小狗",
    
                "TestNessage":"我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗"
    
            }, {
    
                "TestTitle":"我爱小狗",
    
                "TestNessage":"我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗"
    
            }, {
    
                "TestTitle":"我爱小狗",
    
                "TestNessage":"我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗"
    
            }, {
    
                "TestTitle":"我爱小狗",
    
                "TestNessage":"我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗"
    
            }]
    
        }
    
    }
    

    3.2然后我们新建一个实体类装载该list数据

    package com.mumu.jsrecyclerview1;
    
    import java.io.Serializable;
    import java.util.List;
    
    public class TestEntity implements Serializable {
    
        /**
         * Success : true
         * StatusCode : 200
         * Result : {"list":[{"TestTitle":"我爱小狗","TestNessage":"我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗"},{"TestTitle":"我爱小狗","TestNessage":"我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗"},{"TestTitle":"我爱小狗","TestNessage":"我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗"},{"TestTitle":"我爱小狗","TestNessage":"我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗"},{"TestTitle":"我爱小狗","TestNessage":"我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗"}]}
         */
    
        private ResultBean Result;
    
        public ResultBean getResult() {
            return Result;
        }
    
        public void setResult(ResultBean Result) {
            this.Result = Result;
        }
    
        public static class ResultBean {
            private List<ListBean> list;
    
            public List<ListBean> getList() {
                return list;
            }
    
            public void setList(List<ListBean> list) {
                this.list = list;
            }
    
            public static class ListBean {
                /**
                 * TestTitle : 我爱小狗
                 * TestMessage : 我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗我爱小狗
                 */
    
                private String TestTitle;
                private String TestMessage;
    
                public ListBean(String aaa, String bbb) {
                    TestTitle = aaa;
                    TestMessage = bbb;
                }
    
                public String getTestTitle() {
                    return TestTitle;
                }
    
                public void setTestTitle(String TestTitle) {
                    this.TestTitle = TestTitle;
                }
    
                public String getTestMessage() {
                    return TestMessage;
                }
    
                public void setTestMessage(String TestMessage) {
                    this.TestMessage = TestMessage;
                }
            }
        }
    }
    
    

    4,创建适配器类,类名可以自己定义

    package com.mumu.jsrecyclerview1;
    
    import android.support.annotation.Nullable;
    
    import com.chad.library.adapter.base.BaseQuickAdapter;
    import com.chad.library.adapter.base.BaseViewHolder;
    
    import java.util.List;
    
    public class TestAdapter extends BaseQuickAdapter<TestEntity.ResultBean.ListBean, BaseViewHolder> {
        /**
         * 构造器,用来初始化TestAdapter
         *
         * @param data 我们的列表数据
         */
        public TestAdapter(@Nullable List<TestEntity.ResultBean.ListBean> data) {
            super(R.layout.item_test, data);
        }
    
        /**
         * 继承BaseQuickAdapter后需要重写的方法
         *
         * @param helper view持有者,为重用view而设计,减少每次创建view的内存消耗
         * @param data   我们的列表数据
         */
        @Override
        protected void convert(BaseViewHolder helper, TestEntity.ResultBean.ListBean data) {
            //将每一个需要赋值的id和对应的数据绑定
            helper.setText(R.id.test_item_title, data.getTestTitle())
                    .setText(R.id.test_item_message, data.getTestMessage());
        }
    }
    
    

    5,在布局文件中使用,并设置一个id

    <?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=".MainActivity">
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_test"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
        </android.support.v7.widget.RecyclerView>
    </LinearLayout>
    

    6,在主activity中应用

    package com.mumu.jsrecyclerview1;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.View;
    import android.widget.Toast;
    
    import com.chad.library.adapter.base.BaseQuickAdapter;
    
    import java.util.ArrayList;
    
    import butterknife.BindView;
    import butterknife.ButterKnife;
    import butterknife.Unbinder;
    
    public class MainActivity extends AppCompatActivity {
    
        @BindView(R.id.rv_test)
        RecyclerView rvTest;
        private TestAdapter mTestAdapter;
        private ArrayList<TestEntity.ResultBean.ListBean> mTestList;
        private Unbinder unbinder;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            unbinder = ButterKnife.bind(this);
    
            initView();
        }
    
        private void initView() {
    
            //添加临时数据,一般直接从接口获取
            mTestList = new ArrayList<>();
            mTestList.add(new TestEntity.ResultBean.ListBean("我有一个小狗", "我有一个小狗我有一个小狗我有一个小狗我有一个小狗我有一个小狗"));
            mTestList.add(new TestEntity.ResultBean.ListBean("我有一个小狗", "我有一个小狗我有一个小狗我有一个小狗我有一个小狗我有一个小狗"));
            mTestList.add(new TestEntity.ResultBean.ListBean("我有一个小狗", "我有一个小狗我有一个小狗我有一个小狗我有一个小狗我有一个小狗"));
            mTestList.add(new TestEntity.ResultBean.ListBean("我有一个小狗", "我有一个小狗我有一个小狗我有一个小狗我有一个小狗我有一个小狗"));
            mTestList.add(new TestEntity.ResultBean.ListBean("我有一个小狗", "我有一个小狗我有一个小狗我有一个小狗我有一个小狗我有一个小狗"));
            mTestList.add(new TestEntity.ResultBean.ListBean("我有一个小狗", "我有一个小狗我有一个小狗我有一个小狗我有一个小狗我有一个小狗"));
            mTestList.add(new TestEntity.ResultBean.ListBean("我有一个小狗", "我有一个小狗我有一个小狗我有一个小狗我有一个小狗我有一个小狗"));
            mTestList.add(new TestEntity.ResultBean.ListBean("我有一个小狗", "我有一个小狗我有一个小狗我有一个小狗我有一个小狗我有一个小狗"));
            refreshView();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            unbinder.unbind();
        }
    
        /**
         * 刷新消息列表
         */
        private void refreshView() {
            //1,设置LayoutManager,LinearLayoutManager表示竖直向下
            rvTest.setLayoutManager(new LinearLayoutManager(this));
            //2,初始化适配器
            mTestAdapter = new TestAdapter(mTestList);
            //3,绑定recyclerView和适配器
            rvTest.setAdapter(mTestAdapter);
            //4,给recyclerView的每一个子列表添加点击事件
            mTestAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
                @Override
                public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
                    Toast.makeText(MainActivity.this, "我点击了第" + position + "个子view",
                            Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
    
    

    7,项目结构和github地址

    项目结构展示图
    demo地址:https://github.com/mamumu/jsRecyclerView1

    如果有发现错误欢迎指正我及时修改,如果有好的建议欢迎留言。谢谢。

    相关文章

      网友评论

        本文标题:Android中RecyclerView配合BaseRecycl

        本文链接:https://www.haomeiwen.com/subject/hpxffqtx.html