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());
}
});
我正在使用 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());
}
});