Я построил обзор переработчика внутри фрагмента. Данные, которые должны быть заполнены в представлении реселлера, хранятся на удаленном сервере и анализируются через JSON.
. Я использую Retrofit для передачи данных с сервера в приложение. Примечание: я новичок в разработке Android и впервые использую Retrofit, просматривая учебники.
До сих пор я понял следующее, исправьте меня, если я ошибаюсь, поскольку библиотека Retrofit использует другой поток вместо Основной поток для получения ответа от сервера, для полной передачи данных требуется несколько секунд, но до этого времени просмотрщик повторных запросов уже создан с пустым списком ArrayList.
Итак, мой вопрос здесь заключается в том, как удерживать ссылку на просмотрщик от сборки до завершения передачи данных? ИЛИ Как обновить пустой ArrayList после завершения передачи данных и заполнить представление переработчика из этих данных? ИЛИ Вы можете сказать мне, что является лучшим и наиболее эффективным способом достижения желаемого результата.
Я уже пробовал adapter.notifyDataSetChanged()
, но либо не использовал его в нужном месте, либо не использовал это правильный путь, так как это не сработало. Это можно увидеть в коде.
Фрагмент библиотеки: -
package com.diginfoexpert.mybooks.Fragment;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.diginfoexpert.mybooks.Activity.CategoryActvity;
import com.diginfoexpert.mybooks.Adapter.LibraryCategoriesCardAdapter;
import com.diginfoexpert.mybooks.Model.Category;
import com.diginfoexpert.mybooks.Model.LibraryAPI;
import com.diginfoexpert.mybooks.Model.LibraryCategories;
import com.diginfoexpert.mybooks.R;
import java.util.ArrayList;
import Controllers.JSONApiHolder;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.Retrofit.Builder;
import retrofit2.converter.gson.GsonConverterFactory;
public class LibraryFragment extends Fragment implements LibraryCategoriesCardAdapter.CategoryClickListener {
private JSONApiHolder jsonApiHolder;
ArrayList<Category> categories = new ArrayList<>();
LibraryCategoriesCardAdapter adapter;
RecyclerView recyclerView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_library, container, false);
Log.d("RETROFIT", "onCreateView: Library Fragment Started");
recyclerView = view.findViewById(R.id.library_category_recycler_view);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://myurl.in/")
.addConverterFactory(GsonConverterFactory.create())
.build();
jsonApiHolder = retrofit.create(JSONApiHolder.class);
getCategories();
buildRecyclerView();
return view;
}
private void buildRecyclerView() {
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
adapter = new LibraryCategoriesCardAdapter(buildCategoryList(),this);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(adapter);
}
private void getCategories() {
Call<LibraryAPI> call = jsonApiHolder.getLibrary();
call.enqueue(new Callback<LibraryAPI>() {
@Override
public void onResponse(Call<LibraryAPI> call, Response<LibraryAPI> response) {
if(!response.isSuccessful()){
Log.d("RETROFIT", "onResponse: callback failed");
return;
}
else{
Log.d("RETROFIT", "onResponse: callback successful");
LibraryAPI libraryAPI = response.body();
categories = libraryAPI.getCategories();
adapter.notifyDataSetChanged();
for (Category category :categories){
Log.d("RETROFIT", "onResponse: "+category.getTitle());
}
}
}
@Override
public void onFailure(Call<LibraryAPI> call, Throwable t) {
Log.d("RETROFIT", "onFailure: response failed : " +t.getMessage());
}
});
}
private ArrayList<Category> buildCategoryList() {
ArrayList<Category> mList = new ArrayList<>();
// mList.add(new Category("Art"));
// mList.add(new Category("Action"));
// mList.add(new Category("Thrill"));
// mList.add(new Category("Fiction"));
// mList.add(new Category("Romance"));
// mList.add(new Category("Crime"));
// mList.add(new Category("Classical"));
// mList.add(new Category("Financial"));
// mList.add(new Category("Business"));
Log.d("RETROFIT", "Size of categories ArrayList "+categories.size());
return categories;
}
@Override
public void onCategoryClick() {
Intent intent = new Intent(getActivity(), CategoryActvity.class);
startActivity(intent);
}
}
Журнал отладки: -
2020-03-25 14:26:37.536 1703-1703/com.myurl.mybooks D/RETROFIT: onCreateView: Library Fragment Started
2020-03-25 14:26:37.630 1703-1703/com.myurl.mybooks D/RETROFIT: Size of categories ArrayList 0
2020-03-25 14:26:42.171 1703-1703/com.myurl.mybooks D/RETROFIT: onResponse: callback successful
2020-03-25 14:26:42.172 1703-1703/com.myurl.mybooks D/RETROFIT: onResponse: MPPSC Mains Syllabus
2020-03-25 14:26:42.172 1703-1703/com.myurl.mybooks D/RETROFIT: onResponse: MPPSC MAINS PAPER 1 PART "A" History
2020-03-25 14:26:42.172 1703-1703/com.myurl.mybooks D/RETROFIT: onResponse: MPPSC MAINS PAPER 1 PART "B" Geography
2020-03-25 14:26:42.172 1703-1703/com.myurl.mybooks D/RETROFIT: onResponse: MPPSC MAINS PAPER-2 (PART "A") Polity
2020-03-25 14:26:42.172 1703-1703/com.myurl.mybooks D/RETROFIT: onResponse: MPPSC MAINS PAPER 2 (PART "B") Economics & Social
2020-03-25 14:26:42.172 1703-1703/com.myurl.mybooks D/RETROFIT: onResponse: MPPSC MAINS PAPER 3 Science
2020-03-25 14:26:42.172 1703-1703/com.myurl.mybooks D/RETROFIT: onResponse: MPPSC MAINS PAPER 4 Ethics
2020-03-25 14:26:42.173 1703-1703/com.myurl.mybooks D/RETROFIT: onResponse: MPPSC HINDI