Установка значения из внешнего класса в значение, полученное во внутреннем классе - PullRequest
0 голосов
/ 14 июня 2019

У меня есть фрагмент в моем приложении для Android, идея состоит в том, чтобы извлечь информацию из файла json (github) и проанализировать ее для заголовков, которые затем обновляются в моем обзоре переработчика. Я могу вытащить данные просто отлично, получил их в список, который является моей схемой.

Теперь эти данные находятся во внутреннем классе "onResponse", то есть также во внутреннем классе "onCreateView".

Код для обновления моего повторного просмотра находится во внутреннем классе onCreateView. Как передать список от onResponse, onCreate или даже глобальному уровню?

В этом классе у меня есть 2 глобальные переменные:

static List<GithubRepo> list  = new ArrayList<>();
static List<String> List_body = new ArrayList<>();

Теперь, во внутреннем методе класса "Create", который создает мое представление, я использую модификацию для анализа json github, чтобы получить имена некоторых репозиториев.

Я могу получить их просто отлично, но когда я получаю список из "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, я получаю имена во внутреннем классе, устанавливаю их, но они остаются нулевыми, когда я пытаюсь применить новый список к моим представлениям. Как мне установить значения глобальной / статической переменной из переменной в моем внутреннем классе?

Вот и все:

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 Ответ

1 голос
/ 14 июня 2019

То, как вы используете 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()));
}

Это можно реализовать во фрагменте.

Как я уже сказал, есть разные способы сделать это. Я просто пытаюсь показать вам, что вызов на самом деле выполняется асинхронно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...