Android 由 Retrofit 回调填充的适配器
Android adapter populated by Retrofit callback
我有一个导航抽屉,它有一个适配器,可以用一些数据填充 ListView。我正在使用 Retrofit 进行 API 调用以获取数据,并使用回调方法。但是,当调用 getCount 方法时,我在适配器中遇到错误,因为回调尚未完成。显然我 运行 遇到了架构问题,所以我很想听听任何改进这个问题的想法。
private class NavigationDrawerAdapter extends BaseAdapter {
private Context _ctx;
private List<Foo> _foo;
public NavigationDrawerAdapter(Context ctx) {
_ctx = ctx;
setupFoo();
}
private void setupFoo() {
SharedPrefsHelper prefs = new SharedPrefsHelper(_ctx);
String userID = prefs.getItem("userID", "");
ApiManager.getFooService(_ctx).getFoo(userID, fooCallback);
}
Callback fooCallback = new Callback<List<Foo>>() {
@Override
public void success(List<Foo> foo, Response response) {
_foo = foo;
}
@Override
public void failure(RetrofitError e) {
Log.e(Constants.TAG, "Could not get foo: " + e.getMessage());
}
};
@Override
public int getCount() {
// This will throw NullPointerException because _foo isn't populated yet
return _foo.size();
}
}
在你的 setupFoo()
中,你应该像 _foo = new ArrayList<Foo>()
一样初始化 _foo
。
然后,回调returns数据时,在success
方法中用新数据替换"old"foo
数据后,调用notifyDataSetChanged()
让BaseAdapter
知道有新的一天可用。
这通常适合我:
@Override
public int getItemCount() {
return _foo == null ? 0 : _foo.size();
}
returns 如果元素列表为空,则为 0,否则 returns 大小。
这是因为我们知道当 _foo 为空时,大小为 0,因为如果它为空,则列表中没有任何内容。
还有:
@Override
public void success(List<Foo> foo, Response response) {
_foo = foo;
notifyDataSetChanged();
}
任何时候更改适配器的支持数据,都必须在适配器上调用 notifyDataSetChanged。
我有一个导航抽屉,它有一个适配器,可以用一些数据填充 ListView。我正在使用 Retrofit 进行 API 调用以获取数据,并使用回调方法。但是,当调用 getCount 方法时,我在适配器中遇到错误,因为回调尚未完成。显然我 运行 遇到了架构问题,所以我很想听听任何改进这个问题的想法。
private class NavigationDrawerAdapter extends BaseAdapter {
private Context _ctx;
private List<Foo> _foo;
public NavigationDrawerAdapter(Context ctx) {
_ctx = ctx;
setupFoo();
}
private void setupFoo() {
SharedPrefsHelper prefs = new SharedPrefsHelper(_ctx);
String userID = prefs.getItem("userID", "");
ApiManager.getFooService(_ctx).getFoo(userID, fooCallback);
}
Callback fooCallback = new Callback<List<Foo>>() {
@Override
public void success(List<Foo> foo, Response response) {
_foo = foo;
}
@Override
public void failure(RetrofitError e) {
Log.e(Constants.TAG, "Could not get foo: " + e.getMessage());
}
};
@Override
public int getCount() {
// This will throw NullPointerException because _foo isn't populated yet
return _foo.size();
}
}
在你的 setupFoo()
中,你应该像 _foo = new ArrayList<Foo>()
一样初始化 _foo
。
然后,回调returns数据时,在success
方法中用新数据替换"old"foo
数据后,调用notifyDataSetChanged()
让BaseAdapter
知道有新的一天可用。
这通常适合我:
@Override
public int getItemCount() {
return _foo == null ? 0 : _foo.size();
}
returns 如果元素列表为空,则为 0,否则 returns 大小。
这是因为我们知道当 _foo 为空时,大小为 0,因为如果它为空,则列表中没有任何内容。
还有:
@Override
public void success(List<Foo> foo, Response response) {
_foo = foo;
notifyDataSetChanged();
}
任何时候更改适配器的支持数据,都必须在适配器上调用 notifyDataSetChanged。