ListView的getCount()始终返回0

时间:2015-10-11 14:04:30

标签: java android listview parse-platform adapter

我正在使用ParseQueryAdapter来显示ListView,其中包含Parse查询给出的元素集:

ParseQueryAdapter.QueryFactory<AlertObject> factory =
        new ParseQueryAdapter.QueryFactory<AlertObject>() {
            public ParseQuery<AlertObject> create() {
                ParseQuery<AlertObject> query = AlertObject.getQuery();
                query.orderByDescending(AlertObject.TIMESTAMP_KEY);
                query.fromLocalDatastore();
                return query;
            }
        };

alertsListAdapter = new AlertListItemAdapter(activity, factory, thisFragment);
ListView alertsListView = (ListView) rootView.findViewById(R.id.alerts_list_view);
alertsListView.setAdapter(alertsListAdapter);

现在,我想知道ListView中的项目数量,但如果我致电alertsListView.getCount(),则会返回0。我做错了什么?

编辑:有人对此帖进行了否定投票,但未发表评论或要求澄清。所以,为了提高我的问题的可读性,我要求对其原因作出一些解释。

更新:在我的适配器

下面
public class AlertListItemAdapter extends ParseQueryAdapter<AlertObject> {

    private Context context;
    private Fragment listAlertsFragment;

    public AlertListItemAdapter(Context context,
                                ParseQueryAdapter.QueryFactory<AlertObject> queryFactory,
                                Fragment fragment) {
        super(context, queryFactory);
        this.context = context;
        this.listAlertsFragment = fragment;
    }

    @Override
    public View getItemView(final AlertObject alertObject, View view, final ViewGroup parent) {
        [...]
    }

    @Override
    public int getCount() {
        return super.getCount();
    }
}

4 个答案:

答案 0 :(得分:2)

我怀疑(无法确定没有看到Parse代码/ docs)适配器没有立即填充项目,并且在执行查询时,它会自己调用notifyDataSetChanged()以便ListView为项目视图重新查询。

这可以解释为什么getCount()setAdapter(ListAdapter)之后立即返回0,但为什么你也可以看到33项。

您可以像这样验证此日志记录adapter.getCount(),此外,覆盖notifyDataSetChanged,然后观察语句的顺序:

public class AlertListItemAdapter extends ParseQueryAdapter<AlertObject> {

    public AlertListItemAdapter(
            Context context,
            ParseQueryAdapter.QueryFactory<AlertObject> queryFactory,
            Fragment fragment) {
        super(context, queryFactory);
    }

    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
        Log.d("FOO", "item count: " + getCount());
    }

    @Override
    public View getItemView(AlertObject alertObject, View view, ViewGroup parent) {
        Log.d("FOO", "getItemView()");
        ...
    }

    ...
}

如果您需要知道数据何时发生变化,您可以在适配器上注册数据集更改的侦听器:

adapter.registerDataSetObserver(new DataSetObserver() {
    @Override
    public void onChanged() {
        super.onChanged();
        Log.d("Foo", adapter.getCount());
    }
});

答案 1 :(得分:0)

只需编写以下行即可获得列表视图中的项目数:

int count = alertsListView.alertsListAdapter().getCount();

<强>后:

alertsListView.setAdapter(alertsListAdapter);

所以你的代码看起来像是:

alertsListAdapter = new AlertListItemAdapter(activity, factory, thisFragment);
ListView alertsListView = (ListView) rootView.findViewById(R.id.alerts_list_view);
alertsListView.setAdapter(alertsListAdapter);
int count = alertsListView.alertsListAdapter().getCount();

答案 2 :(得分:0)

确保正确传递,存储和覆盖getCount()方法。

如果可能,请提供适配器类的代码

答案 3 :(得分:0)

您确定使用解析AlertObjects填充了ListView吗?

我认为您应该在查询中添加以下内容:

query.findInBackground(new FindCallback<AlertObject>() {
        @Override
        public void done(List<AlertObject> alerts, ParseException e) {
            if (e == null) {
                // Success
                mAlerts = alerts;
                String[] alertObjects = new String[mAlerts.size()];
                Log.v(TAG, "There are " + mAlerts.size() + “ on the parse");
                }
            } else {
                Log.e(TAG, e.getMessage());
            }
        }
    });

Log可以告诉你Parse上有多少个对象。 在此回调中,您可以填充ListView,然后使用

.getCount();
在alertListAdapter上