始终显示Listview空视图

时间:2014-04-17 02:25:03

标签: android listview parse-platform

我使用自定义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
}

2 个答案:

答案 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是不够的,因为ParseQueryAdaptergetView()内的视图类型执行了一些检查,并且不会将调用传递给getItemView()