RecyclerView详解

public class RecyclerView extends ViewGroup implements ScrollingView, NestedScrollingChild {

由上面的继承结构,我们容易看出,RecyclerView实际上也是一个ViewGroup继承了ScrollingView和NestedScrolling,方便实现横向与纵向滑动。

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

RecyclerView的优点:

1.它不关心item是否显示的位置与方式    ---> layoutManager   我们可以仅仅使用layoutManager一句话就可以切换RecyclerView的样式

2.它不关心item如何分割         --->ItemDecoration   我们可以根据自己项目的需要自定义自己的分割线

3.它不关心item增加与删除动画的效果 --->ItemAnimator
 我们可以根据自己的需要定义item的增加与删除动画

4.仅仅关心如何服用view --->ViewHolder        google强制我们使用viewHolder,我们需要自己定义自己的ViewHolder哦。

RecyclerView的缺点:

1.内部没有实现对单个Item点击事件的监听,需要自己定义item的单击和长按事件。

2.对item增加后的position测量不准确,需要在adapter中使用holer.getLayoutPosition()方法获取。

由上我们不难看出,RecyclerView的优点远远大于它的缺点啊,再说它的缺点也不算缺点啊,都有很好的解决办法,那么我们还有什么理由不是哟不过它呢?

SO,我们开始吧。

首先,我们需要引入官方提供的向下兼容的V7包,具体引入方法,这里不再赘述。

下一步在xml文件中引入 RecyclerView。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
         />

</RelativeLayout>

MainActivity

package com.flyou.henucenter.recycterview;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

import com.flyou.henucenter.recycterview.adpater.RecyclerViewAdapter;

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

public class MainActivity extends AppCompatActivity {
    private RecyclerViewAdapter recyclerViewAdapter;
    private List<String> datas;
    private RecyclerView recyclerview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initdate();
        initView();
    }

    private void initdate() {
        datas = new ArrayList<>();
        for (int i = 'A'; i < 'z'; i++) {

            datas.add((char) i + "");
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

        switch (id) {
            //Gridview
            case R.id.action_Gridview:
                GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 4, GridLayoutManager.VERTICAL, false);
                recyclerview.setLayoutManager(gridLayoutManager);
                break;
            case R.id.action_Listview:
                LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);

                recyclerview.setLayoutManager(linearLayoutManager);
                break;

            case R.id.action_hor_GridView:
                GridLayoutManager hor_gridLayoutManager = new GridLayoutManager(this, 4, GridLayoutManager.HORIZONTAL, false);
                recyclerview.setLayoutManager(hor_gridLayoutManager);
                break;
            case R.id.action_pubu:
                break;

            case R.id.action_add:
                recyclerViewAdapter.add(1);
                break;
            case R.id.action_delete:

                recyclerViewAdapter.delete(1);
                break;
        }

        return super.onOptionsItemSelected(item);
    }

    private void initView() {
        recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        recyclerview.setLayoutManager(layoutManager);
//        recyclerview.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));

        recyclerview.setItemAnimator(new DefaultItemAnimator());
        recyclerViewAdapter = new RecyclerViewAdapter(datas, this);
        recyclerview.setAdapter(recyclerViewAdapter);
        recyclerViewAdapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int Position) {
                Toast.makeText(MainActivity.this, "itemClick" + Position, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onItemLongClick(View view, int Position) {

                Toast.makeText(MainActivity.this, "ItemLongClick" + Position, Toast.LENGTH_SHORT).show();
            }
        });

    }
}

Adapter文件

package com.flyou.henucenter.recycterview.adpater;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.flyou.henucenter.recycterview.R;
import java.util.List;

/**
 * 项目名称:My Application
 *
 * 包名:com.flyou.henucenter.myapplication.adpater
 * 作者: flyou
 * 创建时间:15/8/19 11:42
 * 描述:
 */
public class RecyclerViewAdapter extends RecyclerView.Adapter<MyViewHolder> {
    private List<String> mDatas;
    private Context mContex;
    private LayoutInflater mInFlater;
//设置item的回调
    public interface OnItemClickListener {
        void onItemClick(View view, int Position);

        void onItemLongClick(View view, int Position);
    }

    private OnItemClickListener onItemClickListener;

    public void setOnItemClickListener(OnItemClickListener listener) {

        this.onItemClickListener = listener;
    }

    public RecyclerViewAdapter(List<String> datas, Context Contex) {
        this.mContex = Contex;
        this.mDatas = datas;
        mInFlater = LayoutInflater.from(mContex);
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInFlater.inflate(R.layout.item_view, parent, false);
        MyViewHolder viewHolder = new MyViewHolder(view);
        return viewHolder;
    }

    public void add(int pos) {
        mDatas.add(pos, "I am new item ");
        notifyItemInserted(pos);

    }

    public void delete(int pos) {

        mDatas.remove(pos);
        notifyItemRemoved(pos);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        holder.textView.setText(mDatas.get(position));
        if (onItemClickListener != null) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int layoutPosition = holder.getLayoutPosition();
                    onItemClickListener.onItemClick(holder.itemView,layoutPosition);
                }
            });
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int layoutPosition = holder.getLayoutPosition();//增加或删除item使用这个方法获得其position
                    onItemClickListener.onItemLongClick(holder.itemView,layoutPosition);
                    return false;
                }
            });
        }
    }

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

class MyViewHolder extends RecyclerView.ViewHolder {
    TextView textView;

    public MyViewHolder(View itemView) {

        super(itemView);
        textView = (TextView) itemView.findViewById(R.id.textInfo);
    }

}

单个Item

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="@drawable/item_selector"
    android:layout_margin="3dp"
    android:layout_width="match_parent"
    android:layout_height="70dp"
    >

<TextView
    android:id="@+id/textInfo"
    android:gravity="center"
    android:layout_width="72dp"
    android:layout_height="match_parent" />

</RelativeLayout>

menu文件

<menu 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"
    tools:context=".MainActivity">

    <item
        android:id="@+id/action_Listview"
        android:orderInCategory="100"
        android:title="listview"
        app:showAsAction="never" />
    <item
        android:id="@+id/action_Gridview"
        android:orderInCategory="100"
        android:title="gridView"
        app:showAsAction="never" />
    <item
        android:id="@+id/action_hor_GridView"
        android:orderInCategory="100"
        android:title="hor_GridView"
        app:showAsAction="never" />
    <item
        android:id="@+id/action_pubu"
        android:orderInCategory="100"
        android:title="pubuliu"
        app:showAsAction="never" />
    <item
        android:id="@+id/action_add"
        android:orderInCategory="100"
        android:icon="@drawable/ic_menu_add"
        android:title="add"
        app:showAsAction="always" />
    <item
        android:id="@+id/action_delete"
        android:orderInCategory="100"
        android:icon="@drawable/ic_menu_delete"
        android:title="delete"
        app:showAsAction="always" />
</menu>

//设置回调接口,方便在调用出进行处理。

public interface OnItemClickListener {
        void onItemClick(View view, int Position);

        void onItemLongClick(View view, int Position);
    }

    private OnItemClickListener onItemClickListener;

    public void setOnItemClickListener(OnItemClickListener listener) {

        this.onItemClickListener = listener;
    }

没有录制gif大家凑合着看效果。

当然,item的增加和删除是有动画的,大家也可以在github上所有相关的动画库进行使用

https://github.com/gabrielemariotti/RecyclerViewItemAnimators

上面给出其中一个比较出色的RecylerView库。

大家也可以根据自己的需要自行定制,ok就先介绍到这里。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 05:11:08

RecyclerView详解的相关文章

android L新控件RecyclerView详解与DeMo

介绍 在谷歌的官网我们可以看到它是这样介绍的:RecyclerView is a more advanced and flexible version of ListView. This widget is a container for large sets of views that can be recycled and scrolled very efficiently. Use the RecyclerView widget when you have lists with eleme

【Android】RecyclerView详解(一)

1.介绍 RecyclerView是比 ListView 更高级且更具灵活性的组件. 此组件是一个用于显示庞大数据集的容器,可通过保持有限数量的视图进行非常有效的滚动操作. 如果您有数据集合,其中的元素将因用户操作或网络事件而发生改变,请使用 RecyclerView 小组件. RecyclerView使用起来很方便因为它: 提供了一种插拔式的体验,高度的解耦,异常的灵活使用; 显示的样式更丰富包括水平,竖直,Grid,瀑布显示方式; 可以通过ItemDecoration自定义Item间的间隔;

android listview 替代品recyclerview详解

安卓v7支持包下的ListView替代品————RecyclerView RecyclerView这个控件也出来很久了,相信大家也学习的差不多了,如果还没学习的,或许我可以带领大家体验一把这个艺术般的控件. 据官方介绍,该控件是属于之间用的非常多的ListView和GridView的替代品,既然能替代用的如此普遍的它们,这自然有其该有的优势. 1)相对于ListView而言RecyclerView的优势体现在: ①封装了之前ListView的优化,封装了之前ViewHolder的复用,这样在自定

Android RecyclerView详解及实现瀑布流式布局

RecyclerView一个可以代替ListView和GridView的控件,那么RecyclerView到底比他们好在哪里? RecyclerView架构提供了一种插拔式的体验,所以实现了代码的高度解耦,使用起来也异常的灵活. 我们可以通过设置它的LayoutManager控制其显示的方式,通过ItemDecoration控制Item间的间隔,通过ItemAnimator控制Item的增删动画 RecyclerView.LayoutManager提供了三个实现类其中LinearLayoutMa

【Android 界面效果47】RecyclerView详解

RecylerView作为 support-library发布出来,这对开发者来说绝对是个好消息.因为可以在更低的Android版本上使用这个新视图.下面我们看如何获取 RecylerView.首先打开Android SDK Manager,然后更新Extras->Android Support Library即可. 然后在本地../sdk/extras/android/support/v7中找到recyclerview.我已经将下载好的Recyclerview整理成一个Eclipse可编译的L

RecyclerView使用详解(三)

在上一篇(RecyclerView使用详解(二))文章中介绍了RecyclerView的多Item布局实现,接下来要来讲讲RecyclerView的Cursor实现,相较于之前的实现,Cursor有更多的使用场景,也更加的常用,特别是配合LoaderManager和CursorLoader进行数据的缓存及加载显示,基于此我们来重点看看RecyclerView的CursorAdapter具体要怎么实现. 一.CursorAdapter实现(配合LoaderManager和CursorLoader)

RecyclerView使用详解(二)

在上一篇(RecyclerView使用详解(一))文章中简单的介绍了RecyclerView的基本用法,接下来要来讲讲RecyclerView的更多用法,要实现不同的功能效果,大部分都还是在于RecyclerView的Adapter写法,所以我们着重来看看几种不同功能的Adapter写法. 一.多Item布局实现(MultipleItem) 如果之前你用过ListView实现过此功能,那么你一定对下面这两个方法并不陌生 @Override public int getItemViewType(i

Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 这一章很多,但是很有趣,也是这书的最后一章知识点了,我现在还在考虑要不要写这个拼图和2048的案例,在此之前,我们先来玩玩Android5.X的新特性吧!

ANDROID L——Material Design详解(UI控件)

转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lollipop(5.0). 前几天发现Android5.0正式版的sdk已经可以下载了,而且首次搭载Android L系统的Nexus 6和 Nexus 9也即将上市. 所以是时候开始学习Android L了! 关于Android L如何配置模拟器和创建项目,如果大家有兴趣的话可以看看我之前的一篇文章: A