由Retrofit回调填充的Android适配器

时间:2015-03-08 20:46:39

标签: android android-adapter retrofit

我有一个导航抽屉,它有一个适配器用一些数据填充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();
}

}

2 个答案:

答案 0 :(得分:1)

setupFoo()中,您应该像_foo一样初始化_foo = new ArrayList<Foo>()

然后,当回调返回数据时,更换&#34; old&#34; foo方法中包含新数据的success数据,请致电notifyDataSetChanged()BaseAdapter知道新的一天可用。

答案 1 :(得分:1)

这通常对我有用:

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

返回0,否则返回大小。

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

也:

 @Override
public void success(List<Foo> foo, Response response) {
    _foo = foo;
    notifyDataSetChanged();
}

每次更改适配器的后备数据时,都必须在适配器上调用notifyDataSetChanged。