我的安卓应用程序中有一个片段,这个想法是从 json 文件 (github) 中提取信息并将其解析为标题,然后将其更新到我的回收器视图中。我可以很好地提取数据,将其放在列表中,这是我的架构。
现在,此数据位于"onResponse"内部类中,该类也位于"onCreateView"内部类中。
更新我的回收器视图的代码在onCreateView内部类中。如何将列表从 onResponse、onCreate 甚至全局级别传递?
在该类中,我有 2 个全局变量:
static List<GithubRepo> list = new ArrayList<>();
static List<String> List_body = new ArrayList<>();
现在,在创建视图的内部类"Create"方法中,我正在使用改造来解析 github 的 json 以获取一些存储库名称。
我可以很好地获得它们,但是当我从"response.body"获取列表时,然后将其正确解析为字符串,仅使用以下方法获取标题:
private void setList(List<GithubRepo> repo){
if (repo != null) {
int counter = 0;
for (GithubRepo r : repo) {
String name = r.getName().toString();
List_body.add(name);
counter++;
}
}
else{
Log.d("test:empty", "empty");
}
}
上面的 GithubRepo 只是 json 的对象结构,我在内部类中获取名称并设置它们,但是当我尝试将新列表应用于我的视图时,它们仍然为 null。如何从内部类中的变量设置全局/静态变量的值?
这是整个事情:
public class primary_fragment extends Fragment implements Agg_Adapter.ItemClickListener {
static List<GithubRepo> list = new ArrayList<>(); <--------HOLDS value of schema object temporarily
static List<String> List_body = new ArrayList<>(); <--------UPDATES the recyclerview, currently empty
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState) {
.... Some code
call.enqueue(new Callback<List<GithubRepo>>() {
@Override <------------------------- From here is the inner class
public void onResponse(Call<List<GithubRepo>> call, Response<List<GithubRepo>> response) {
// 1. start
if (response.isSuccessful()) {
if (response.body() != null) {
list.addAll(response.body());
setList(list);
});
Log.d("testedB2!:", (List_body.toString())); <------Should have the values set but it is null
这可能是一件非常简单的事情,但我已经忘记了!如果我需要澄清任何事情,请告诉我。
您使用 Retrofit 的方式使调用异步。这没有错,事实上它应该是这样的。但是,假设List_body
应该填写在打印到日志的行中是不正确的。简而言之,在网络调用完成之前,Log.d
将运行并不打印任何内容。
有不同的方法可以解决此问题。最简单的方法是从onResponse
中调用一个方法,让片段知道列表已准备就绪。例如:
call.enqueue(new Callback<List<GithubRepo>>() {
@Override
public void onResponse(Call<List<GithubRepo>> call, Response<List<GithubRepo>> response) {
if (response.isSuccessful()) {
if (response.body() != null) {
list.addAll(response.body());
setList(list);
onListReady();
});
一旦调用了方法onListReady()
,如果需要,您可以打印 log 语句:
private void onListReady () {
Log.d("testedB2!:", (List_body.toString()));
}
您可以在片段中实现这一点。
就像我说的,有不同的方法可以做到这一点。我只是想向您展示调用实际上是异步运行的。