recyclerview setEmptyView 实施 - android

recyclerview setEmptyView implementation - android

我正在尝试通过使用 AdapterDataObserver 创建自定义 recyclerview class 来实现 setEmptyView 方法,就像此处描述的一些用户:

Equivalent of ListView.setEmptyView in RecyclerView

问题是它对我不起作用。当列表充满数据时,我可以完美地看到列表项,但当列表为空时,我看不到我的空视图。

这是我的自定义回收视图:

package bikurim.silverfix.com.bikurim.utils.general;

import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

/**
 * Created by David on 16/07/2016.
 *
 * A custom implementation of the RecyclerView class for supporting setEmptyView() method
 *
 * @author David Lasry
 */
public class FamilyRecyclerView extends RecyclerView {

    private View emptyView;
    private AdapterDataObserver emptyObserver = new AdapterDataObserver() {

        @Override
        public void onItemRangeChanged(int positionStart, int itemCount) {
            checkIfEmpty();
        }

        @Override
        public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
            checkIfEmpty();
        }

        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            checkIfEmpty();
        }

        @Override
        public void onItemRangeRemoved(int positionStart, int itemCount) {
            checkIfEmpty();
        }

        @Override
        public void onChanged() {
            checkIfEmpty();
        }
    };
    public FamilyRecyclerView(Context context) {
        super(context);
    }

    public FamilyRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public FamilyRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setAdapter(Adapter adapter) {
        super.setAdapter(adapter);

        if(adapter != null) {
            adapter.registerAdapterDataObserver(emptyObserver);
        }

        checkIfEmpty();
    }

    public void setEmptyView(View emptyView) {
        this.emptyView = emptyView;
    }

    private void checkIfEmpty() {
        if(emptyView != null && getAdapter() != null) {
            final boolean isEmpty = getAdapter().getItemCount() == 0;
            emptyView.setVisibility(isEmpty ? VISIBLE : GONE);
            setVisibility(isEmpty ? GONE : VISIBLE);
        }
    }
}

这是我的 activity 中的部分,我从布局资源中扩充视图并将其设置为我的空视图:

FamilyRecyclerView recyclerView = (FamilyRecyclerView) findViewById(R.id.rv);
View emptyView = getLayoutInflater().inflate(R.layout.empty_layout, null);
recyclerView.setEmptyView(emptyView);

稍微调试了一下,emptyView不为null,说明inflation成功

这里有什么问题?

看起来你还没有将 emptyView 添加到层次结构中的任何地方,当你膨胀它时你将父级设置为 null 并且当你在 listView 中切换它的可见性时你从未真正添加它作为任何视图的子项。因此,它存在但不显示在屏幕上。要显示它,您可以使用父视图对其进行膨胀或在 inflation:

之后将其添加到父视图
getLayoutInflater().inflate(R.layout.empty_layout, contentView);

contentView.addView(emptyView);

contentView 是持有你的 recyclerView 的视图)