ANDROID: MVVM + Модификация: как и где мне получить список объектов JSON из массива объектов JSON? - PullRequest
0 голосов
/ 12 июня 2019

Я настроил все для звонков и получаю список с размером 0. После некоторых исследований я понял, что пытаюсь получить объекты JSON, а корнем моего response.body является массив JSON. Я проверил Интернет, похоже, мне нужно добавить обертку к моей «Задаче» (которая является моей моделью), делать вызовы с помощью Списка. Но я точно не понимаю, как мне это сделать. Где я могу получить массив JSON и где и как именно я должен проанализировать корень массива объектов JSON в список объектов JSON, чтобы я мог продолжить связывание в представлении рециркулятора.

Модель:

public class Task {
@SerializedName("taskId")
@Expose
private int taskId;

private int requestId;

private int currentEventId;

private int technicianId;

private int supervisorId;

private String status;

@SerializedName("category")
@Expose
@Nullable
private String itemCategory;


@SerializedName("brand")
@Expose
@Nullable
private String itemBrand;


@SerializedName("model")
@Expose
@Nullable
private String itemModel;


@SerializedName("series")
@Expose
@Nullable
private String itemSeria;

@SerializedName("series")
@Expose
@Nullable
private String address;

private String requestIndicator;
private String requestCode;
private String requestName;
private String requestCompanyLogo;

@SerializedName("assignDate")
@Expose
private String assignDate;

@SerializedName("assignDate")
@Expose
private String assignTime;

private List<Task> tasks = null;


public int getTaskId() {
    return taskId;
}

public void setTaskId(int taskId) {
    this.taskId = taskId;
}

public int getRequestId() {
    return requestId;
}

public void setRequestId(int requestId) {
    this.requestId = requestId;
}

public int getCurrentEventId() {
    return currentEventId;
}

public void setCurrentEventId(int currentEventId) {
    this.currentEventId = currentEventId;
}

public int getTechnicianId() {
    return technicianId;
}

public void setTechnicianId(int technicianId) {
    this.technicianId = technicianId;
}

public int getSupervisorId() {
    return supervisorId;
}

public void setSupervisorId(int supervisorId) {
    this.supervisorId = supervisorId;
}

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public String getAssignDate() {
    return assignDate;
}

public void setAssignDate(String assignDate) {
    this.assignDate = assignDate;
}

public String getRequestName() {
    return requestName;
}

public void setRequestName(String requestName) {
    this.requestName = requestName;
}

public String getItemCategory() {
    return itemCategory;
}

public void setItemCategory(String itemCategory) {
    this.itemCategory = itemCategory;
}

public String getItemBrand() {
    return itemBrand;
}

public void setItemBrand(String itemBrand) {
    this.itemBrand = itemBrand;
}

public String getItemModel() {
    return itemModel;
}

public void setItemModel(String itemModel) {
    this.itemModel = itemModel;
}

public String getItemSeria() {
    return itemSeria;
}

public void setItemSeria(String itemSeria) {
    this.itemSeria = itemSeria;
}

public String getRequestIndicator() {
    return requestIndicator;
}

public void setRequestIndicator(String requestIndicator) {
    this.requestIndicator = requestIndicator;
}

public String getRequestCode() {
    return requestCode;
}

public void setRequestCode(String requestCode) {
    this.requestCode = requestCode;
}

public String getRequestCompanyLogo() {
    return requestCompanyLogo;
}

public void setRequestCompanyLogo(String requestCompanyLogo) {
    this.requestCompanyLogo = requestCompanyLogo;
}

public String getAssignTime() {
    return assignTime;
}

public void setAssignTime(String assignTime) {
    this.assignTime = assignTime;
}

public List<Task> getTasks() {
    return tasks;
}

public void setTasks(List<Task> tasks) {
    this.tasks = tasks;
}

}

Webservice:

public interface TaskWebService {
@GET("tasks/new")
Call<List<Task>> getTasks(@Query("count") int count, @Query("pageNumber") int pageNumber, @Query("taskStatus") String taskStatus, @Header("token") String token);

}

RetrofitNetworkService:

public class RetrofitNetworkService {

private static final String BASE_URL = "bla bla bla";


private static Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build();

public static <S> S createService(Class<S> serviceClass) {
    return retrofit.create(serviceClass);
}

}

TaskRepository:

public class TaskRepo {

private static TaskRepo taskRepo;
private static TaskWebService taskWebService;

private TaskRepo() {
    taskWebService = 
RetrofitNetworkService.createService(TaskWebService.class);
}

public static TaskRepo getInstance() {
    if (taskRepo == null) {
        taskRepo = new TaskRepo();
    }
    return taskRepo;
}

public MutableLiveData<List<Task>> getTasks(int count, int pageNumber, String taskStatus, String token) {

    final MutableLiveData<List<Task>> allTasks = new MutableLiveData<>();

    taskWebService.getTasks(count, pageNumber, taskStatus, token).enqueue(new Callback<List<Task>>() {
        @Override
        public void onResponse(Call<List<Task>> call, Response<List<Task>> response) {
            if (response.isSuccessful()) {
                allTasks.setValue(response.body());
            }
        }

        @Override
        public void onFailure(Call<List<Task>> call, Throwable t) {
            allTasks.setValue(null);
            t.printStackTrace();
        }
    });
    return allTasks;
}

} * * тысяча двадцать-один

ViewModel:

открытый класс ViewModelTask ​​расширяет ViewModel {

private MutableLiveData<List<Task>> allTasks = new MutableLiveData<>();
private TaskRepo taskRepo;

public void initialize() {
    if (allTasks != null) {
        return;
    }
    taskRepo = TaskRepo.getInstance();
    allTasks = taskRepo.getTasks(15, 0, "", ""code);
}

public LiveData<List<Task>> getAllTasks() {
    return allTasks;
}

}

Вид:

открытый класс FragmentTabAll расширяет Fragment {

private RecyclerView taskRecyclerView;
private int adapterType;
private List<Task> taskList = new ArrayList<>();
private ViewModelTask viewModelTask;
private TaskAdapter taskAdapter;


public FragmentTabAll(int adapterType) {
    this.adapterType = adapterType;
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_tab_all, container, false);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    taskRecyclerView = view.findViewById(R.id.task_cardview);
    taskAdapter = new TaskAdapter(getActivity());
    checkAdapterType();
}

private void checkAdapterType() {
    if (adapterType == Utils.TASK_ADAPTER) {
        taskRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false));
        viewModelTask = ViewModelProviders.of(this).get(ViewModelTask.class);
        viewModelTask.initialize();
        taskRecyclerView.setAdapter(taskAdapter);

        viewModelTask.getAllTasks().observe(getActivity(), new Observer<List<Task>>() {
            @Override
            public void onChanged(List<Task> tasks) {
                taskList.addAll(tasks);
                taskRecyclerView.setAdapter(taskAdapter);
                taskAdapter.setTaskList(taskList);
            }
        });
        taskRecyclerView.setAdapter(taskAdapter);

    } else if (adapterType == Utils.REQUEST_ADAPTER) {
        taskRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false));
        taskRecyclerView.setAdapter(new RequestAdapter(getActivity()));
    }
}

}

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

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

Я нашел ответ, публикуя здесь, если кто-то столкнется с той же проблемой.Во ViewModel у меня была следующая строка:

private MutableLiveData> allTasks = new MutableLiveData <> ();

Инициализация allTasks давала ему нулевое значение, следовательно, в приведенном ниже операторе if это быловсегда возвращая и не получая список из TaskRepo, следовательно, я получаю нулевое значение в списке, который я получаю в пользовательском интерфейсе.

0 голосов
/ 13 июня 2019

Я не могу отладить ваш код, но, увидев его, я думаю, что проблема здесь:

 public MutableLiveData<List<Task>> getTasks(int count, int pageNumber, String taskStatus, String token) {

        final MutableLiveData<List<Task>> allTasks = new MutableLiveData<>();

        taskWebService.getTasks(count, pageNumber, taskStatus, token).enqueue(new Callback<List<Task>>() {
            @Override
            public void onResponse(Call<List<Task>> call, Response<List<Task>> response) {
                if (response.isSuccessful()) {
                    allTasks.setValue(response.body());
                }
            }

            @Override
            public void onFailure(Call<List<Task>> call, Throwable t) {
                allTasks.setValue(null);
                t.printStackTrace();
            }
        });
        return allTasks;
    }

getTasks - это асинхронный вызов, потому что вы возвращаете Call из вашего интерфейса (если вы хотитесинхронное поведение, вы можете захотеть повторно создать список или что-то еще), поэтому allTasks LiveData не ждет ответа, а просто возвращает пустые LiveData.

Я предлагаю вам работать с обратными вызовами, просто измените возврат на voidи передайте обратный вызов по параметру, например:

public void getTasks(int count, int pageNumber, String taskStatus, String token, OnCompleteCallback onComplete) {


        taskWebService.getTasks(count, pageNumber, taskStatus, token).enqueue(new Callback<List<Task>>() {
            @Override
            public void onResponse(Call<List<Task>> call, Response<List<Task>> response) {
                if (response.isSuccessful()) {
                    onComplete.done(response.body())
                }
            }

            @Override
            public void onFailure(Call<List<Task>> call, Throwable t) {
                onComplete.done(null)
                t.printStackTrace();
            }
        });
    }

Теперь вам нужно изменить свою модель представления для публикации ваших данных, чтобы ваша активность / фрагмент могли получать ваши изменения

allTasks = taskRepo.getTasks(15, 0, "", ""code, new OnCompleteCallback<>{
     @Override
     void done(List<Tasks> mListTasks){
          if (mListTasks != null){
            allTasks.postValue(mListTaks)
          }
     }
});

В этот момент ваша активность / фрагмент должны быть выполнены для выполнения всех задач, тогда вы делаете все, что вам нужно.Надеюсь, это поможет вам

...