通过重写RecyclerView.Adapte设置emptyview空页面

我们知道,RecyclerView的出现,更大程度给了开发者去自定义自己希望的布局,RecyclerView可以通过引入不同的ViewType进行不同的列表显示,举个列子:及时通讯的聊天记录,一般都会有左边的布局跟右边的布局,那么,就有两个不同的ViewType了,根据不同情况进行引入不同的ViewType。(哈哈,这个我也做过耶)好,那么,我们也可以根据我们的情况进行引入布局啊,例如,如果数据为空的时候,那我能不能在我们的Adapter里面引入一个emptyView这样的布局。

package com.example.zq.recyclerviewdemo.module;
/**
 * 适配器,模拟列表
 */
public class EmptyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {

    private static final String TAG = "EmptyAdapter";

    private EmptyAdapter.onRecyclerViewListener onRecyclerViewListener;
    private List<Person> mList;

    /**
     * viewType--分别为item以及空view
     */
    public static final int VIEW_TYPE_ITEM = 1;
    public static final int VIEW_TYPE_EMPTY = 0;

    public EmptyAdapter(List<Person> datas) {
        mList = datas;
    }


    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //在这里根据不同的viewType进行引入不同的布局
        if (viewType == VIEW_TYPE_EMPTY) {
            View emptyView = LayoutInflater.from(parent.getContext()).inflate(R.layout.empty_view_tab, parent, false);

            return new RecyclerView.ViewHolder(emptyView) {

            };

        }
        //其他的引入正常的
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_item_person_info, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
        if (holder instanceof MyViewHolder) {
            MyViewHolder hd = (MyViewHolder) holder;
            Person person = mList.get(position);
            hd.ivEditHead.setTag(position);
            hd.ivDelete.setTag(position);
            hd.tvPersonInfo.setText(person.getAddress());
            hd.ivEditHead.setImageResource(person.getHeadIconId());
            hd.ivEditHead.setOnClickListener(this);
            hd.ivDelete.setOnClickListener(this);
        }
    }

    @Override
    public int getItemCount() {
        //同时这里也需要添加判断,如果mData.size()为0的话,只引入一个布局,就是emptyView
        // 那么,这个recyclerView的itemCount为1
        if (mList.size() == 0) {
            return 1;
        }
        //如果不为0,按正常的流程跑
        return mList.size();
    }

    @Override
    public int getItemViewType(int position) {
        //在这里进行判断,如果我们的集合的长度为0时,我们就使用emptyView的布局
        if (mList.size() == 0) {
            return VIEW_TYPE_EMPTY;
        }
        //如果有数据,则使用ITEM的布局
        return VIEW_TYPE_ITEM;
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.iv_edit_head:
                int position = (int) v.getTag();
                Log.i(TAG, "onClick: position:::" + position);
                onRecyclerViewListener.editHeadIcon(position);
                break;
            case R.id.iv_delete:
                int position1 = (int) v.getTag();
                onRecyclerViewListener.deleteInfo(position1);
                break;
            default:
                break;
        }
    }


    class MyViewHolder extends RecyclerView.ViewHolder {

        ImageView ivEditHead;
        TextView tvPersonInfo;
        ImageView ivDelete;

        public MyViewHolder(View itemView) {
            super(itemView);
            ivEditHead = itemView.findViewById(R.id.iv_edit_head);
            tvPersonInfo = itemView.findViewById(R.id.tv_person_info);
            ivDelete = itemView.findViewById(R.id.iv_delete);
        }
    }

    public void setOnRecyclerViewListener(EmptyAdapter.onRecyclerViewListener onRecyclerViewListener) {
        this.onRecyclerViewListener = onRecyclerViewListener;
    }

    public interface onRecyclerViewListener {
        void editHeadIcon(int position);

        void deleteInfo(int position);
    }
}

在使用第三种方式,设置空布局的时候,发下现RelativeLayout中的子view的layout_height="match_parent"不起作用。

还是先把空布局代码贴出来吧。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorAccent"
    android:gravity="center">


    <ImageView
        android:id="@+id/iv_empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@mipmap/empty_view_tab" />

    <TextView
        android:id="@+id/empty_view_message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/iv_empty"
        android:layout_gravity="center"
        android:text="暂无内容下拉刷新"
        android:textColor="@android:color/darker_gray"
        android:textSize="12sp" />

</RelativeLayout>

在这里插入图片描述
哎丑到爆,你会发现根布局中的 android:layout_height="match_parent"没有起作用,首先有一点你不用怀疑,红色区域的高度也不等于设置的子项的item的高度哦,这一点我已经证实。另外如果指定了高度(只要不是match_parent都可以)那么布局就会起作用。找度娘要答案,前篇一律的说应该加载空布局时应该使用

   View emptyView = LayoutInflater.from(parent.getContext()).inflate(R.layout.empty_view_tab, parent, false);

而不能使用

   View emptyView = LayoutInflater.from(parent.getContext()).inflate(R.layout.empty_view_tab, null);

等等。

一般情况加载布局这样用是没问题的,但是,我已经使用的是上面inflate(R.layout.empty_view_tab, parent, false);的布局了啊,还是没有起作用啊。

划重点:
造成这种情况的原因:

其实不是RelativeLayout中的子view的layout_height="match_parent"不管用,而是relativeLayout的layout_height没起作用。

listview(我们这里用的是RecyclerView)的item的高度是适应于item内部的容纳view的最大高度的,也就是说,他自己是无法设置高度的,这个类似于marginTop(或者bottom)不起作用。

而子view的match_parent又是适应于parent的最大高度,因此子view的高度成为了item内所有子view的最大高度,最终成为了大家都是wrap_parent。

好啦,文章给出了答案,我就不再解释了。那么怎么能让方案三正常使用呢?
答案:更改空布局。


```xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorAccent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/iv_empty"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:src="@mipmap/empty_view_tab" />

        <TextView
            android:id="@+id/empty_view_message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:text="暂无内容下拉刷新"
            android:textColor="@android:color/black"
            android:textSize="12sp" />

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:layout_alignParentBottom="true" />

</RelativeLayout>

这样就可以了,只需要添加一个可以用到**android:layout_alignParentBottom=“true”**属性的TextView即可,这样系统就会认为我们的空布局的高度就是填充屏幕的高度。这样就可以了。
实在不行,你也可以使用TextView的 android:drawableTop=“@drawable/ic_launcher” 属性来添加图片也是可以的。
在这里插入图片描述

相信大家都会在想,哪一种方式更好用,这得看个人的需求,但我更倾向于用第二种,因为google这两年提供了许多很好的资源给我们开发者使用,最热的莫过于是support-design包里的一些新控件,tabLayout、toolbar、CoordinatorLayout等等,但如果想要更好的使用它们很炫的一些效果,得好好了解一下NestedScrollingParent这个接口,google提供了这些接口很好的处理了事件分发的处理,而RecyclerView均实现了这些接口,能很好的配合support-design使用其特效。说的啥意思呢?
简单粗暴,就是RecyclerView的配合使用很多,能少动RecyclerView就少动,不然在日后配套使用的时候可能会遇到别的问题,因此就改动Adapter喽。

————————————————
版权声明:本文为CSDN博主「游走的大千世界的烤腰子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhangqunshuai/article/details/81238767

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值