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