RecylerView使用详解(分享整理)

RecylerView介绍

RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用户只要实现自己的viewholder就可以了,该组件会自动帮你回收复用每一个item。

用它替代listview的原因有几个:

  • 封装了viewholder的回收复用;
  • RecyclerView使用布局管理器管理子view的位置,也就是说你再不用拘泥于ListView的线性展示方式,如果之后提供其他custom LayoutManager的支持,你能够使用复杂的布局来展示一个动态组件。
  • 自带了ItemAnimation,可以设置加载和移除时的动画,方便做出各种动态浏览的效果。

RecylerView在哪里

包名:android.support.v7.widget.RecyclerView

文件地址有两个
1:android-sdk/extras/android/m2repository/com/android/support/
recyclerview-v7
2:android-sdk/extras/android/support/v7/recyclerview

AndroidStudio中添加依赖

在build.gradle(Module:app)中添加:

    dependencies {
            compile 'com.android.support:recyclerview-v7:21.0.0'
    }

如何使用

layout文件中:

<?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="match_parent"
              android:orientation="vertical"
    >

    <android.support.v7.widget.RecyclerView
        android:id="@+id/view_recycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="5dp"
        android:scrollbars="vertical"
        ></android.support.v7.widget.RecyclerView>

</LinearLayout>

代码中:

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        mRecyclerView.setLayoutManager(linearLayoutManager);
        RecyclerViewAdapter viewAdapter = new RecyclerViewAdapter(this, getListdata());
        mRecyclerView.setAdapter(viewAdapter);


public List<String> getListdata() {
        ArrayList<String> strings = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            strings.add(i, i + "ddddd");
        }
        return strings;
    }

RecyclerView.Adapter介绍

package com.ht.fyforandroid;

import android.content.Context;
import android.support.v4.widget.TextViewCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by niehongtao on 16/8/14.
 */
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private List<String> dataList;
    private LayoutInflater mInflater;

    public RecyclerViewAdapter(Context context, List<String> dataList) {
        this.dataList = dataList;
        mInflater = LayoutInflater.from(context);
    }


    @Override
    public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.item_recycler_view, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerViewAdapter.ViewHolder holder, int position) {
        holder.tv.setText(dataList.get(position));
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }


    static class ViewHolder extends RecyclerView.ViewHolder {
        private TextView tv;

        public ViewHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv_name);
        }
    }
}

3种LayoutManager

LinearLayoutManager:线性布局,支持横向和纵向布局。
public LinearLayoutManager(Context context)
public LinearLayoutManager(Context context, int orientation, boolean reverseLayout)

GridLayoutManager: Grid布局
public GridLayoutManager(Context context, int spanCount)
public GridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout)

StaggeredGridLayoutManager: 瀑布流布局
public StaggeredGridLayoutManager(int spanCount, int orientation)

参数:
orientation:设置布局方向,参数:HORIZONTAL 或者 VERTICAL
spanCount:设置行列数值
reverseLayout:设置是否反向布局,默认false横向时从左向右,纵向时从上到下

添加点击事件

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0327/2647.html

数据变化刷新

public final void notifyDataSetChanged()
public final void notifyItemChanged(int position)
public final void notifyItemRangeChanged(int positionStart, int itemCount)
public final void notifyItemInserted(int position)
public final void notifyItemMoved(int fromPosition, int toPosition)
public final void notifyItemRangeInserted(int positionStart, int itemCount)
public final void notifyItemRemoved(int position)
public final void notifyItemRangeRemoved(int positionStart, int itemCount)

添加删除数据动画


1   Person person = new Person(i, "WangJie_" + i, 10 + i);
2   adapter.notifyItemInserted(2);
3   personList.add(2, person);
4   adapter.notifyItemRangeChanged(2, adapter.getItemCount());

如上代码:
Line2:表示在position为2的位置,插入一条数据,这个时候动画开始执行。
Line3: 表示在数据源中position为2的位置新增一条数据(这个才是真正的新增数据)。
Line4: 为什么要刷新position为2以后的数据呢?因为,在position为2的位置插入了一条数据后,新数据的position变成了2,那原来的position为2的应该变成了3,3的应该变成了4,所以2以后的所有数据的position都发生了改变,所以需要把position2以后的数据都要刷新。理论上是这样,但是实际上刷新的数量只有在屏幕上显示的position为2以后的数据而已。如果这里使用notifyDataSetChanged()来刷新屏幕上显示的所有item可以吗?结果不会出错,但是会有一个问题,前面调用了notifyItemInserted()方法后会在执行动画,如果你调用notifyDataSetChanged()刷新屏幕上显示的所有item的话,必然也会刷新当前正在执行动画的那个item,这样导致的结果是,前面的动画还没执行完,它马上又被刷新了,动画就看不见了。所以只要刷新2以后的item就可以了。

设置Item动画效果

mRecyclerView.setItemAnimator(new DefaultItemAnimator());

参考资料

https://github.com/CymChad/CymChad.github.io

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值