由改装回调填充的Android适配器

由改装回调填充的Android适配器,android,android-adapter,retrofit,Android,Android Adapter,Retrofit,我有一个导航抽屉,它有一个适配器,可以用一些数据填充ListView。我使用改型来进行API调用以获取数据,并使用回调方法。但是,当调用getCount方法时,我在适配器中遇到了一个错误,因为回调尚未完成。很明显,我在这里遇到了一个架构问题,所以我很乐意听到任何改进这一点的想法 private class NavigationDrawerAdapter extends BaseAdapter { private Context _ctx; private List<Foo> _foo

我有一个导航抽屉,它有一个适配器,可以用一些数据填充ListView。我使用改型来进行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();
}
私有类NavigationDrawerapter扩展BaseAdapter{
私有上下文;
私人名单(u foo),;
公共导航抽屉雷达(上下文ctx){
_ctx=ctx;
setupFoo();
}
私有void setupFoo(){
SharedPrefsHelper prefs=新的SharedPrefsHelper(_ctx);
字符串userID=prefs.getItem(“userID”,”);
getFooService(_ctx).getFoo(userID,fooCallback);
}
Callback fooCallback=new Callback(){
@凌驾
public void成功(列出foo、响应){
_foo=foo;
}
@凌驾
公共无效故障(e错误){
Log.e(Constants.TAG,“无法获取foo:+e.getMessage());
}
};
@凌驾
public int getCount(){
//这将引发NullPointerException,因为尚未填充_-foo
返回_foo.size();
}
}

setupFoo()
中,应该像
\u foo=new ArrayList()
那样初始化
\u foo


然后,当回调返回数据时,在
success
方法中将“old”
foo
数据替换为新数据后,调用
BaseAdapter
让我知道有新的一天可用。

这通常对我有效:

@Override
public int getItemCount() {
    return _foo == null ? 0 : _foo.size();
}
如果元素列表为空,则返回0,否则返回大小

这是因为我们知道当_foo为空时,大小为0,因为如果为空,则列表中没有任何内容

此外:

@覆盖
public void成功(列出foo、响应){
_foo=foo;
notifyDataSetChanged();
}

无论何时更改适配器的备份数据,都必须在适配器上调用notifyDataSetChanged。

谢谢,这很有效。谢谢你的代码片段。
 @Override
public void success(List<Foo> foo, Response response) {
    _foo = foo;
    notifyDataSetChanged();
}