Android Listview始终显示空视图
我在listview中使用自定义加载数据。我想在没有数据时显示消息,但即使数据不是空的,也会显示消息。我认为这是因为数据尚未加载。我试过使用Android Listview始终显示空视图,android,listview,parse-platform,Android,Listview,Parse Platform,我在listview中使用自定义加载数据。我想在没有数据时显示消息,但即使数据不是空的,也会显示消息。我认为这是因为数据尚未加载。我试过使用setEmptyView,也试过在适配器上测试mAdapter.isEmpty() 我试着在测试适配器是否为空之前等待几秒钟,但尽管它可以工作,但我认为这不是一个好的做法 我在其中进行查询的自定义适配器: public class CategoryEventsAdapter extends ParseQueryAdapter<Event> {
setEmptyView
,也试过在适配器上测试mAdapter.isEmpty()
我试着在测试适配器是否为空之前等待几秒钟,但尽管它可以工作,但我认为这不是一个好的做法
我在其中进行查询的自定义适配器:
public class CategoryEventsAdapter extends ParseQueryAdapter<Event> {
public CategoryEventsAdapter(Context context, final String c) {
super(context, new ParseQueryAdapter.QueryFactory<Event>() {
public ParseQuery<Event> create() {
ParseQuery<Event> query = new ParseQuery<Event>("Event");
query.whereEqualTo("published", true);
query.whereEqualTo("category", c);
return query;
}
});
}
@Override
public View getItemView(Event event, View v, ViewGroup parent) {
...
}
}
我从未使用过解析的这一特定部分,但看看文档,查询似乎是异步的。相反,您可以尝试以下方法:
mAdapter = new CategoryEventsAdapter(getActivity(), category);
// add a listener for when the query is done.
mAdapter.addOnQueryLoadListener(new OnQueryLoadListener<ParseObject>() {
public void onLoaded(List<ParseObject> objects, ParseException e) {
// Check if empty here and show message.
if (objects.size == 0){
// show message
}
}
});
listview.setAdapter(mAdapter);
mAdapter=newcategoryeventsadapter(getActivity(),category);
//在查询完成时为添加侦听器。
mAdapter.addOnQueryLoadListener(新的OnQueryLoadListener(){
已加载公共void(列出对象,Parsee异常){
//检查此处是否为空并显示消息。
如果(objects.size==0){
//显示消息
}
}
});
setAdapter(mAdapter);
因此,一旦查询完成,它应该调用
onload
,这样您就可以确定它是否为空。在onload
中,可以检查对象的计数
参数。如果您在此时执行mAdapter.isEmpty
,则不确定它是否已在适配器中设置 这是我的ParseQueryAdapter实现,它允许您选择一个“空”占位符。您只需从外部调用adapter.setEmptyLayoutId(R.layout.empty)
public class ParseAdapter extends ParseQueryAdapter {
private final static int EMPTY_VIEW = 2;
private int emptyViewLayoutId;
private boolean isEmpty;
public ParseAdapter(Context c, QueryFactory<? extends ParseObject> q) {
super(c, q);
addOnQueryLoadListener(new OnQueryLoadListener() {
@Override
public void onLoading() {
isEmpty = false;
}
@Override
public void onLoaded(List list, Exception e) {
if (list == null || list.size() == 0) {
isEmpty = true;
}
}
});
}
@Override
public void notifyDataSetChanged() {
isEmpty = false;
super.notifyDataSetChanged();
}
public void setEmptyLayoutId(int emptyViewLayoutId) {
this.emptyViewLayoutId = emptyViewLayoutId;
}
@Override
public View getItemView(ParseObject object, View v, ViewGroup parent) {
if (isEmpty) {
v = View.inflate(getContext(), emptyViewLayoutId, null);
return v;
}
v = v != null ? v : View.inflate(getContext(), rowLayoutId, null);
//do whatever you want on v
return v;
}
@Override
public int getViewTypeCount() {
return super.getViewTypeCount() + 1; //3
}
@Override
public int getItemViewType(int position) {
return isEmpty ? EMPTY_VIEW : super.getItemViewType(position);
}
@Override
public int getCount() {
return isEmpty ? 1 : super.getCount();
}
}
公共类ParseAdapter扩展了ParseQueryAdapter{
私有最终静态int空_视图=2;
私有int emptyViewLayoutId;
私有布尔是空的;
public ParseAdapter(上下文c,QueryFactory)能否发布ListView布局以及如何设置空视图?
public class ParseAdapter extends ParseQueryAdapter {
private final static int EMPTY_VIEW = 2;
private int emptyViewLayoutId;
private boolean isEmpty;
public ParseAdapter(Context c, QueryFactory<? extends ParseObject> q) {
super(c, q);
addOnQueryLoadListener(new OnQueryLoadListener() {
@Override
public void onLoading() {
isEmpty = false;
}
@Override
public void onLoaded(List list, Exception e) {
if (list == null || list.size() == 0) {
isEmpty = true;
}
}
});
}
@Override
public void notifyDataSetChanged() {
isEmpty = false;
super.notifyDataSetChanged();
}
public void setEmptyLayoutId(int emptyViewLayoutId) {
this.emptyViewLayoutId = emptyViewLayoutId;
}
@Override
public View getItemView(ParseObject object, View v, ViewGroup parent) {
if (isEmpty) {
v = View.inflate(getContext(), emptyViewLayoutId, null);
return v;
}
v = v != null ? v : View.inflate(getContext(), rowLayoutId, null);
//do whatever you want on v
return v;
}
@Override
public int getViewTypeCount() {
return super.getViewTypeCount() + 1; //3
}
@Override
public int getItemViewType(int position) {
return isEmpty ? EMPTY_VIEW : super.getItemViewType(position);
}
@Override
public int getCount() {
return isEmpty ? 1 : super.getCount();
}
}