将外部类的值设置为内部类中获取的值

时间:2019-06-14 08:29:10

标签: java android global-variables retrofit2 inner-classes

我的android应用程序中有一个片段,其想法是从json文件(github)中提取信息并解析标题信息,然后将其更新到我的recyclerview中。我可以很好地提取数据,并把它放在一个列表中,这就是我的模式。

现在,此数据位于“ onResponse”内部类中,也位于“ onCreateView”内部类中。

更新我的recyclerview的代码在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

这可能真的很简单,但是我忘记了!让我知道是否需要澄清任何事情。

1 个答案:

答案 0 :(得分:1)

您使用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()被调用,您可以根据需要打印日志语句:

private void onListReady () {
     Log.d("testedB2!:", (List_body.toString()));
}

您可以在片段中实现。

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