ListView 的 getCount() 总是 returns 0

ListView's getCount() always returns 0

我正在使用 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(),它会 returns 0。我做错了什么?

编辑:有人给了这个 post 反对票,但没有发表评论或要求澄清。所以,我要求对其中的原因进行一些解释,以提高我的问题的可读性。

更新:在我的适配器下面

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();
    }
}

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

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();

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

如果可能请提供适配器代码class

您确定您使用解析 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 上。

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

这可以解释为什么您的 getCount() returns 0 紧跟在 setAdapter(ListAdapter) 之后,但为什么您还可以看到 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());
    }
});