2015-03-08 47 views
1

我有一个导航抽屉,它有一个适配器用一些数据填充ListView。我使用Retrofit进行API调用以获取数据,并使用回调方法。但是,当getCount方法被调用时,因为回调尚未完成,所以在适配器中出现错误。很明显,我遇到了一个架构问题,所以我很乐意听到任何想法来改善这一点。通过改进回调填充的Android适配器

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(); 
} 

}

回答

1

这通常为我工作:

@Override 
public int getItemCount() { 
    return _foo == null ? 0 : _foo.size(); 
} 

返回0,如果元素列表为空,否则返回的大小。

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

也:

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

您更改适配器的支持数据的任何时候,你必须调用notifyDataSetChanged适配器上。

+0

谢谢,这工作。并感谢代码片段。 – Matt 2015-03-10 10:25:25

1

在你setupFoo(),你应该初始化_foo_foo = new ArrayList<Foo>()

然后,当回调返回数据,在success方法与新的数据替换“旧” foo数据后,调用notifyDataSetChanged()BaseAdapter知道有可用的新的一天。

相关问题