将外部类中的值设置为在内部类中检索的值



我的安卓应用程序中有一个片段,这个想法是从 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()));
}

您可以在片段中实现这一点。

就像我说的,有不同的方法可以做到这一点。我只是想向您展示调用实际上是异步运行的。

相关内容

  • 没有找到相关文章

最新更新