recyclerview setEmptyView实现 - android

时间:2016-07-16 14:13:59

标签: android view android-recyclerview android-adapter observable

我正在尝试通过使用AdapterDataObserver创建自定义的recyclerview类来实现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);
        }
    }
}

以下是我的活动中我从布局资源中提取视图并将其设置为我的空视图的部分:

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

我稍微调试了一下,而且emptyView不为空,这意味着通胀成功。

这里有什么问题?

1 个答案:

答案 0 :(得分:0)

看起来你没有将emptyView添加到任何地方的层次结构中,当你给它充气时,你将父设置为null,当你在listView中切换它的可见性时,你从未真正将它添加为任何观点的孩子。因此,它存在但不会显示在屏幕上。为了让它显示出来,您可以使用父视图对其进行充气,或者在充气后将其添加到父视图中:

getLayoutInflater().inflate(R.layout.empty_layout, contentView);

contentView.addView(emptyView);

contentView是持有recyclerView的视图)