多数据显示之强大的RecycleView 使用完全解析(初级基础篇)

来源:互联网 发布:知乎电脑版下载官网 编辑:程序博客网 时间:2024/06/06 10:58

前言

RecycleView是谷歌V7包中新增的控件,用于替代以往多数据显示的控件(ListView,GridView…),一个新的替代的事物的出现,必定有这比之前更便捷灵活的特性。那么为什么RecycleView为什么会用来替代ListView和GridView呢?

  • 同类文章
    多数据显示之强大的RecycleView 使用完全解析(中级篇)

特点

  • 结构高度灵活

    1. LayoutManager : 控制显示方式分为LinearLayoutManager、GridLayoutManager和StaggeredGridLayoutManager,当然你也可以自定义LayoutManager,可以控制显示的方向和位置
    2. Adapter:适配器,下面会详细讲解
    3. ItemDecoration:定义每个Item之间的间距,可自定义ItemDecoration,详情参照
    4. ItemAnimator : item 的动画管理类
  • 内部实现内存回收

    1. 内部封装了ViewHolder,加入了内存回收。

    RecycleView的显示和数据加载全部分解成了几块去分别管理,以往从ListView转换成GridView需要重写布局和代码,但是现在你只需要改变一下LayoutManager就可以了,高度解耦了功能之间的联系。


基本使用

下面就说一下RecycleView的基本应用,而后几章中会补充自定义的 LayoutManager 和自定义的 ItemDecoration 来更好的扩展。

  • 添加依赖(buid.gradle)
dependencies {    ...    compile 'com.android.support:cardview-v7:23.1.1'    compile 'com.android.support:recyclerview-v7:23.1.1'}
  • XML调用activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.demo.demorecycleview.MainActivity">    <android.support.v7.widget.RecyclerView        android:id="@+id/my_recycleView"        android:layout_width="match_parent"        android:layout_height="match_parent"/></LinearLayout>
  • XML调用item_recycleview.xml
<?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="wrap_content"    android:background="@color/colorAccent"    android:orientation="vertical">    <!--    注意此处的RelativeLayout    如果Item中,直接在根容器放入控件,会出现显示异常错误,宽和高的值都会出现误差    -->    <RelativeLayout        android:layout_width="match_parent"        android:layout_height="wrap_content">        <TextView            android:id="@+id/tv_item"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:gravity="center"            android:text="123"            android:textSize="20sp"            android:textColor="@color/white"            android:layout_marginTop="10dp"            android:layout_marginBottom="10dp"/>    </RelativeLayout></LinearLayout>

注!:Item的布局会对显示有很大的影响,如果在根容器中直接写控件,显示出来的结果相当于宽高根据控件最小的范围自适应,造成不一样的结果。所以Item在编写时最好在根容器内添加一个容器用来控制Item的间距,这样适用于简单的布局可以用这个笨方法,但是最终还是建议通过ItemDecoration来控制Item之间的间距

  • MyRecycleViewAdapter
package com.demo.demorecycleview.Adapter;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import com.demo.demorecycleview.R;import java.util.List;import butterknife.Bind;import butterknife.ButterKnife;/** * Created by UnableApe */public class MyRecycleViewAdapter extends RecyclerView.Adapter<MyRecycleViewAdapter.MyViewHolder> {    private List<String> mListData;    @Override    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycleview, null);        MyViewHolder mHolder = new MyViewHolder(view);        return mHolder;    }    @Override    public void onBindViewHolder(MyViewHolder holder, int position) {        holder.tvItem.setText(mListData.get(position));    }    @Override    public int getItemCount() {        return mListData.size();    }    public void setListData(List list) {        mListData = list;        notifyDataSetChanged();    }    public static class MyViewHolder extends RecyclerView.ViewHolder {        @Bind(R.id.tv_item)        TextView tvItem;        MyViewHolder(View view) {            super(view);            ButterKnife.bind(this, view);        }    }}

自定义Adapter需重写三个方法,如上
onCreateViewHolder(ViewGroup parent, int viewType)
此方法根据不同的viewType返回不同的holder
onBindViewHolder(MyViewHolder holder, int position)
此方法根据holder绑定相关数据
getItemCount()
此方法返回数据的数量

另外还会有
getItemViewType(int position)
此方法跟距position返回不同的item的布局
会在多数据显示之强大的RecycleView 使用完全解析(中级篇)详细介绍

  • MainActivity
package com.demo.demorecycleview;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import com.demo.demorecycleview.Adapter.MyRecycleViewAdapter;import java.util.ArrayList;import java.util.List;import butterknife.Bind;import butterknife.ButterKnife;public class MainActivity extends AppCompatActivity {    @Bind(R.id.my_recycleView)    RecyclerView myRecycleView;    private MyRecycleViewAdapter mAdapter;    private List mListData ;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.bind(this);        initData();        initView();    }    private void initView() {        //设置显示方式        LinearLayoutManager llManager = new LinearLayoutManager(this);        llManager.setOrientation(LinearLayoutManager.VERTICAL);        myRecycleView.setLayoutManager(llManager);        //设置Adapter        mAdapter = new MyRecycleViewAdapter();        mAdapter.setListData(mListData);        myRecycleView.setAdapter(mAdapter);    }    private void initData() {        mListData = new ArrayList();        for(int i =1;i<15;i++){            mListData.add("这是第"+i+"个Item");        }    }}

实现多个ViewType 自定义LayoutManager实现不同的显示方式 自定义ItemDecoration 以及RecycleView的相关注意问题
多数据显示之强大的RecycleView 使用完全解析(中级篇)

0 0
原创粉丝点击