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

前言

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
"1.0" encoding="utf-8"?>
"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">

    "@+id/my_recycleView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

  • XML调用item_recycleview.xml
"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorAccent"
    android:orientation="vertical">
    
    "match_parent"
        android:layout_height="wrap_content">
        "@+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"/>
    

注!: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 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");
        }
    }
}

多数据显示之强大的RecycleView 使用完全解析(初级基础篇)_第1张图片

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

你可能感兴趣的:(View,View)