Retrofit + Recycler.Adapter
Вообщем, идея такова. Есть RecyclerView, который должен добавлять CardView, и изменять параметры.
Параметры должены приходить запросом, запросы деляться на id ( тобишь, отправляются id на сервер, получаем запрос - запихиваем в CardView ), таких запросов может быть N кол-во, ( зависит от нажатой кнопки ).
Сделал recyclerView.setHasFixedSize(true) , передал N Адаптеру. В Адаптере public void onBindViewHolder(@NonNull CardViewHolder holder, int position) , retrofit принимает запросы, но порой он не успевает из за интернета все принять , и происходит ахинея на экране.
На данный фрагмент накладывается CardView через Адаптер:
public class FullCardFragment extends Fragment {
private RecyclerView recyclerView;
private CardAdapter cardAdapter;
private View root;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
root =inflater.inflate(R.layout.fragment_full_card, container, false);
init();
return root;
}
private void init(){
recyclerView = root.findViewById(R.id.rv_container);
LinearLayoutManager linearLayoutManager =new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(linearLayoutManager);
// recyclerView.setHasFixedSize(true);
cardAdapter = new CardAdapter(getArguments().getInt("countCard"));
// CardAdapter.setPartnerArrayList(partnerArrayList);
recyclerView.setAdapter(cardAdapter);
}
Сам адаптер:
public class CardAdapter extends RecyclerView.Adapter<CardAdapter.CardViewHolder> {
private Retrofit retrofit;
private API api;
private final String URL = "******";
private int i;
private static ArrayList<String> numbersCategory =new ArrayList<>(); // номера категорий, которые есть в категории
private Gson gson;
private static ArrayList<Partner> partnerArrayList = new ArrayList<>();
private int numberItems;
public static void setNumberItem(ArrayList<String> array){
numbersCategory.clear();
numbersCategory.addAll(array);
}
public CardAdapter(int numberOfItems){ // количество Холдеров
numberItems = numberOfItems;
}
@NonNull
@Override
public CardViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Context context = parent.getContext();
int layoutIdListItem = R.layout.fragment_card;
LayoutInflater inflater =LayoutInflater.from(context);
View view = inflater.inflate(layoutIdListItem,parent,false);
CardViewHolder cardViewHolder = new CardViewHolder(view);
init();
return cardViewHolder;
}
private void init(){
//retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
api = retrofit.create(API.class);
System.out.println(numbersCategory.get(i) + " Проверка категории");
}
@Override
public void onBindViewHolder(@NonNull CardViewHolder holder, int position) {
Call<Partner> partnerCall = api.partnerId(Integer.parseInt(numbersCategory.get(position)));
partnerCall.enqueue(new Callback<Partner>() {
@Override
public void onResponse(Call<Partner> call, Response<Partner> response) {
System.out.println(" Загрузил" );
partnerArrayList.add(response.body());
}
@Override
public void onFailure(Call<Partner> call, Throwable throwable) {
System.out.println(throwable);
}
});
if (partnerArrayList.size()!=0) {
System.out.println(position + " позиция");
holder.bind(partnerArrayList.get(position));
}
}
@Override
public int getItemCount() {
return numberItems;
}
class CardViewHolder extends RecyclerView.ViewHolder {
private TextView titleShop;
private TextView titleBarShop;
private TextView description;
public CardViewHolder(@NonNull View itemView) {
super(itemView);
titleShop = itemView.findViewById(R.id.titleShop);
titleBarShop = itemView.findViewById(R.id.titleBarShop);
description = itemView.findViewById(R.id.descriptionShop);
}
void bind(Partner partner) {
System.out.println("проверка");
titleShop.setText(partner.getTitle());
// description.setText(partner.getText());
}
}
Если не убирать фиксированный размер, то ошибок никаких не вылетает, он просто начинает кидать на экран что попало ( Может по 2 раза повторить одну Card, может вообще ничего не загрузить и оставить образец ).
Если setHasFixedSize(true) - выходит ошибка java.lang.IndexOutOfBoundsException: Index: 2, Size: 2 - если начинаешь прокручивать