android:RecycleView的简单封装使用

Posted FightSeeker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android:RecycleView的简单封装使用相关的知识,希望对你有一定的参考价值。

本文主要简单的介绍一下最最简单的RecycleView的使用方法。首先说一下具体的类所起的作用:

BaseRecycleView.java:一个抽象类直接继承在RecyclerView,在内部实现了item的点击,长按,以及设置emptyView的功能,其中点击和长按实现了状态切换的功能,state_pressed.并对外开放了两个抽象接口getLayoutManger()和getItemDecoration(),分别是设置LayoutManger和分割线的。

BaseRecyleAdapter.java:一个继承在RecyclerView.Adapter的泛型抽象类,对外开放了3个抽象的方法
getItemLayoutId():设置item的布局
convertCreateViewHolder(View itemView):viewHolder与ietemView绑定
convertBindViewHolder(MyViewHolder viewHolder, int position):把对象中的内容展示出来,和listviewgetView一个功能

BaseViewHolder.java:一个继承在RecyclerView.ViewHolder的抽象类,简单的实现了view的保存与获取功能

FlexDividerDecoration.java:分割线设置,对外开放Builder,通过设置Builder中的参数,来绘制不同的分割线,暂时提供,drawable,color,paint三种绘制方式。

FinalRecycleView.java:继承子BaseRecycleView,具体的RecycleView实现,重写了getLayoutManger()与getItemDecoration()方法。可以在xml布局中自由配置显示的LayoutManger的style以及分割线。具体的配置属性值如下:

<declare-styleable name="FinalRecycleView">
        <attr name="showStyle" format="enum"><!-- 显示形式,list or grid -->
             <enum name="LISTVIEW_VERTICAL" value="0" />
             <enum name="LISTVIEW_HORIZONTAL" value="1" />
             <enum name="GRIDVIEW_NORMAL" value="2" />
             <enum name="STAGGERED_HORIZONTAL" value="3" />
             <enum name="STAGGERED_VERTICAL" value="4" />
        </attr>
        <attr name="gridSpanCount" format="integer"/> <!-- grid列数 -->
        <attr name="innerDivider" format="reference"/>
        <attr name="innerDividerWidth" format="dimension"/>
    </declare-styleable>

下面主要说一下FinalRecycleView的具体使用方法:

1.xml布局文件如下:

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

    <com.seeker.weight.super_recycleView.FinalRecycleView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        final:showStyle="LISTVIEW_VERTICAL"
        final:gridSpanCount="4"
        final:innerDivider="@drawable/color_line"
        final:innerDividerWidth="1dp"/>

    <include layout="@layout/empty"/>

</RelativeLayout>

其中empty布局的设置如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/emptyView"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Nothing"
        android:textSize="30sp"
        android:gravity="center"
        android:textColor="@android:color/black"/>

</LinearLayout>

2.MyAdapter.java文件写法:

package com.seeker.SuperRecycleview;

import java.util.List;
import android.content.Context;
import android.view.View;
import com.seeker.weight.super_recycleView.BaseRecyleAdapter;

public class MyAdapter extends BaseRecyleAdapter<String,MyViewHolder> 

    public MyAdapter(Context context, List<String> datas) 
        super(context, datas);
    

    @Override
    public int getItemLayoutId() 
        return R.layout.item;
    

    @Override
    public MyViewHolder convertCreateViewHolder(View itemView) 
        return new MyViewHolder(itemView);
    

    @Override
    public void convertBindViewHolder(MyViewHolder viewHolder, int position) 
        viewHolder.setText(R.id.item_text, mDatas.get(position));
    

写法很简单,就是回调三个接口,返回item布局,绑定viewholder,以及设置文字展示等。

3.MyViewHolder.java文件写法:

package com.seeker.SuperRecycleview;

import android.view.View;
import android.widget.TextView;
import com.seeker.weight.super_recycleView.BaseViewHolder;

/**
 * Created by Seeker on 2016/7/19.
 */
public class MyViewHolder extends BaseViewHolder

    public MyViewHolder(View view)
        super(view);
    

    /**
     * 为TextView设置字符串
     * @param viewId
     * @param text
     * @return
     */
    public MyViewHolder setText(int viewId, String text) 
        TextView view = getView(viewId);
        if(view != null && text != null)
            view.setText(text);
        
        return this;
    

新加了一个方法,就是setText,给TextView设置文字展示。

4.在MainActivity.java中具体用法如下:

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

        mRecyclerView = (FinalRecycleView) findViewById(R.id.recyclerview);

        final List<String> list = new ArrayList<>();

        final MyAdapter myAdapter = new MyAdapter(this, list);

        mRecyclerView.setAdapter(myAdapter);

        View empty = findViewById(R.id.emptyView);

        empty.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                for (int i = 0; i < 52; i++) 
                    list.add(""+i);
                
                myAdapter.notifyDataSetChanged();
            
        );

        mRecyclerView.setEmptyView(empty);

        mRecyclerView.setOnItemClickListener(new BaseRecycleView.OnItemClickListener() 

            @Override
            public void onItemClick(View itemView, int position) 
                Toast.makeText(MainActivity.this, "click:" + list.get(position), Toast.LENGTH_SHORT).show();
            
        );

        mRecyclerView.setOnLongClickListener(new BaseRecycleView.OnLongItemClickListener() 

            @Override
            public void onLongItemClick(View itemView, int position) 
                Toast.makeText(MainActivity.this, "longClick:"+list.get(position), Toast.LENGTH_SHORT).show();
            
        );
    

首先是获取FinalRecycleView的实例对象,然后就是设置Adapter,设置emptyView,设置点击事件以及长按事件。点击事件和长按事件中,简单的Toast一下文字内容。
其中,一开始的时候,list中数据为空,在empty点击之后list数据填充,并调用myAdapter.notifyDataSetChanged();刷新界面。下面看一下效果图:

效果图很明显了,实现empty的显示,以及点击长按的功能,并且点击长按状态也发生响应的变化。

5.具体的方法使用就是那样,现在再说一下,其它的。
设置不同的分割线:在FinalRecycleView中,改写方法getItemDecoration()即可。如当前想显示分割线颜色为红色,大小为2的,代码设置如下:

    @Override
    public ItemDecoration getItemDecoration() 
        return new FlexDividerDecoration.Builder(getContext())
                .setColor(Color.RED)
                .setSize(2)
                .build();
    

效果图如下:

drawable图片也可以设置:如下

    @Override
    public ItemDecoration getItemDecoration() 
        return new FlexDividerDecoration.Builder(getContext())
                .setDrawableResId(R.drawable.divider)
                .setSize(2)
                .build();
    

效果图就不贴了。

6.设置显示样式,我想显示gridview并且是4列,则在xml中布局改为如下:

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

    <com.seeker.weight.super_recycleView.FinalRecycleView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        final:showStyle="GRIDVIEW_NORMAL"
        final:gridSpanCount="4"
        final:innerDivider="@drawable/color_line"
        final:innerDividerWidth="1dp"/>

    <include layout="@layout/empty"/>

</RelativeLayout>

则效果图如下:

到这就为止了,RecycleView简单的封装就是这样,只是简化了使用步骤,用起来更像我们熟悉的ListView和GridView罢了。

RecycleView下载链接地址,RecycleView下载链接地址,RecycleView下载链接地址,RecycleView下载链接地址

以上是关于android:RecycleView的简单封装使用的主要内容,如果未能解决你的问题,请参考以下文章

[Android] Android RecycleView和ListView 自定义Adapter封装类

自己封装的工具类,使用原生SwipeRefreshLayout+RecycleView实现下拉刷新和加载更多

增强版的RecycleViewAdapter,能够直接使用

对RecycleView的多种item布局的封装

android 简单实现 recycleview,adapter 展示item,点击展示详情

Android-ViewPager2