Как передать список во фрагмент с использованием Retrofit и RecyclerView
Я пытаюсь получить список с использованием Retrofit и RecyclerView во фрагмент. В классе RestClient не получается передать именно список, а не отдельную какую-то строку в опредеоенной позиции. И так же в классе фрагмента не понимаю, куда извлечь полученные данные. По идее в список, но как?
мой класс RestClient:
public class RestClient implements Callback <Source> {
private static final String BASE_URL = "https://frt.org/v2/";
private ApiInterface apiInterface;
private MainActivity mainActivity;
public RestClient(MainActivity mainActivity) {
this.mainActivity = mainActivity;
}
public void start() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
apiInterface = retrofit.create(ApiInterface.class);
Call<Source> news = apiInterface.getNews();
news.enqueue(this);
}
@Override
public void onResponse(Call<Source> call, Response<Source> response) {
Source source = response.body();
String sourceName = source.getName();
Bundle bundle = new Bundle();
bundle.putString("sourceName", sourceName);
FragmentManager fm = mainActivity.getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
NameFragment fragmentCurrent = new NameFragment();
fragmentCurrent.setArguments(bundle);
ft.add(R.id.fragment, fragmentCurrent);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();
}
@Override
public void onFailure(Call<Source> call, Throwable t) {
Log.d("error", "can't parse data: ", t);
}
}
мой класс фрагмент:
public class NameFragment extends Fragment {
private List<Source> sources = new ArrayList<>();
private RecyclerView recyclerView;
//private MainActivity mainActivity;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.name_fragment, container, false);
recyclerView = view.findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext()));
recyclerView.setAdapter(new NewsAdapter(getActivity(),sources));
Bundle bundle = this.getArguments();
if (bundle!=null) {
String sourcNam = bundle.getString("sourceName");
???
}
return view;
}
Ответы (1 шт):
Автор решения: Yura Ivanov
→ Ссылка
У вас не в ту сторону граф зависимостей "построен". RestClient ничего не должен знать ни об activity, ни о каких-либо фрагментах.
В activity вставьте фрагмент, в фрагменте обратитесь к RestClient'у за данными, и в onResponse отстройте список. Псевдокод:
MainActivity.onCreate {
getSupportFragmentManager().beginTransaction().add(NameFragment.newInstance()).commit();
}
// https://developer.android.com/reference/androidx/recyclerview/widget/ListAdapter
NewsAdapter extends androidx.recyclerview.widget.ListDataper<News, NewsHolder>{
...
}
NameFragment.onViewCreated {
recyclerView.setAdapter(adapter);
restClient.getNews(adapter::submitList);
}
interface ResponseCallback {
void done(List<Source> response);
}
restClient.getNews(ResponseCallback cb){
Call<List<Source>> news = apiInterface.getAllNews();
news.enqueue(new Callback <List<Source>>(){
@Override
public void onResponse(Call<List<Source>> call, Response<List<Source>> response) {
cb.done(response.body());
}
...
);
}
ЗЫ Это все начало пути.