我使用自定义ParseQueryAdapter在listview中加载数据。我希望在没有数据时显示消息,但即使数据不为空,也会显示消息。我认为这是因为数据尚未加载。我尝试使用setEmptyView
并尝试使用适配器if 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);
listview.setAdapter(mAdapter);
if (mAdapter.isEmpty()) {
// show message
}
答案 0 :(得分:2)
我从未使用过Parse的这个特定部分但是查看文档时,查询似乎是异步的。相反,你可以试试这个:
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);
因此,一旦查询完成,它应该调用onLoaded
,以便您可以确定它是否为空。在onLoaded
中,您可以检查objects
参数的计数。如果您在此时mAdapter.isEmpty
,则不确定它是否已在适配器中设置。
答案 1 :(得分:0)
这是我的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();
}
}
您需要添加项目视图类型,否则,如果为空,则在某些情况下不会调用getItemView()
。覆盖getCount()
以返回1是不够的,因为ParseQueryAdapter
对getView()
内的视图类型执行了一些检查,并且不会将调用传递给getItemView()
。