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 的视图)
我正在尝试通过使用 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 的视图)