Как использовать два ArrayList в одном адаптере Android studio Java?

#java #android #android-recyclerview #android-adapter

Вопрос:

Я знаю, что этот вопрос задавался раньше, но я не мог понять и интегрировать это в свой код. У меня есть 2 списка.Один для данных api, а другой для данных базы данных.Массив базы данных успешно работает, когда он один. Но когда я добавляю arraylist API, я получаю это исключение java.lang.Исключение IndexOutOfBoundsException: Индекс: 0, Размер: 0

Это фрагмент файла;

 RecyclerView cuzdan_rc;
private ArrayList<CuzdanModel> cuzdanModels;
CuzdanAdapter adapter;

private VeriTabani vt;
CoinMarketApi api;




private List<Datum> cuzdanList =null;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.varliklarim_fragment_layout, container, false);
    vt = new VeriTabani(getActivity());
    cuzdan_rc=rootView.findViewById(R.id.cuzdan_recycler_view);
    api = ApiClient.getClient().create(CoinMarketApi.class);
    CoinList();
    RecyclerBagla(rootView);


    return rootView;
}
private void RecyclerBagla(View rootView) {
    cuzdan_rc=rootView.findViewById(R.id.cuzdan_recycler_view);
    cuzdanList = new ArrayList<>();
    cuzdanModels = new CuzdanDao().Cuzdan(vt);
    adapter = new CuzdanAdapter(getActivity(),cuzdanModels,cuzdanList);

    cuzdan_rc.setAdapter(adapter);
    cuzdan_rc.setLayoutManager(new LinearLayoutManager(getActivity()));


}
public void CoinList() {
    Call<CryptoModel> call = api.coinMarketListCall("500");


    call.enqueue(new Callback<CryptoModel>() {

        @Override
        public void onResponse(Call<CryptoModel> call, Response<CryptoModel> response) {

            CryptoModel list = response.body();

            cuzdanList.clear();
            cuzdanList.addAll(list.getData());
         

            adapter.notifyDataSetChanged();
        }

        @Override
        public void onFailure(Call<CryptoModel> call, Throwable t) {
             Toast.makeText(getActivity(), "onFailure", Toast.LENGTH_SHORT).show();
            Log.d("XXXX", t.getLocalizedMessage());
            call.cancel();
        }
    });

}
 

И это класс адаптеров;

 public class CuzdanAdapter extends RecyclerView.Adapter<CuzdanAdapter.CardTasarimTutucu> {

private Context context;
private List<CuzdanModel> cuzdanList;
private List<Datum> mData;
public CuzdanAdapter(Context context, List<CuzdanModel> cuzdanList,List<Datum> mData) {
    this.context = context;
    this.cuzdanList = cuzdanList;
    this.mData=mData;
}

@NonNull
@Override
public CardTasarimTutucu onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cuzdan_rc_tasarim, parent, false);
    return new CardTasarimTutucu(view);
}

@Override
public void onBindViewHolder(@NonNull CardTasarimTutucu holder, int position) {

    Datum datum = mData.get(position);

    CuzdanModel cuzdan = cuzdanList.get(position);
    holder.textViewCoinDegeriAdapter.setText(String.valueOf(datum.getQuote().getUSD().getPrice()));
    holder.textViewCoinAdi.setText(cuzdan.getCoin_adi());

    holder.textViewAlisFiyatiAdapter.setText(String.format("%.3f",cuzdan.getCoin_alis_fiyati()));
    holder.textViewCoinAdediAdapter.setText(String.format("%.3f",cuzdan.getCoin_alis_adeti()));

}

@Override
public int getItemCount() {
    return cuzdanList.size();
}

public class CardTasarimTutucu extends RecyclerView.ViewHolder {
    private TextView textViewCoinAdi, textViewCoinDegisimAdapter,
            textViewCoinAdediAdapter, textViewCoinDegeriAdapter, textViewAlisFiyatiAdapter;
    private CardView cuzdan_cardView;

    public CardTasarimTutucu(@NonNull View itemView) {
        super(itemView);
        textViewCoinAdi = itemView.findViewById(R.id.textViewCoinAdiAdapter);
        textViewCoinDegisimAdapter = itemView.findViewById(R.id.textViewCoinDegisimAdapter);
        textViewCoinAdediAdapter = itemView.findViewById(R.id.textViewCoinAdediAdapter);
        textViewCoinDegeriAdapter = itemView.findViewById(R.id.textViewCoinDegeriAdapter);
        textViewAlisFiyatiAdapter = itemView.findViewById(R.id.textViewAlisFiyatiAdapter);
        cuzdan_cardView = itemView.findViewById(R.id.cuzdan_cardView);


    }
}


}
 

Почему это не работает? Мне нужна твоя помощь.

Комментарии:

1. Понятия не имею, что вы пытаетесь сделать. Я не вижу 2 списков. Пожалуйста, сообщите нам, где вы получаете это исключение массива за пределами границ.

2. пожалуйста, убедитесь, что cuzdanModels содержит данные… перед настройкой адаптера.

3. Массивы @DavidWasser определены в адаптере. Ошибки следующие:cuzdanadapter.onBindViewHolder(CuzdanAdapter.java: 38) CuzdanAdapter.onBindViewHolder(CuzdanAdapter.java:17) java 38 указывает на эту строку «Datum datum = mData.get(позиция)»; и java 17 указывает на это «общедоступный класс CuzdanAdapter расширяет RecyclerView. Адаптер<CuzdanAdapter.CardTasarimTutucu>»

4. @hafiza Я уже использую модели cuzdan в другом фрагменте, и это работает.

Ответ №1:

Вы создаете и инициализируете адаптер следующим образом:

 cuzdanList = new ArrayList<>();
cuzdanModels = new CuzdanDao().Cuzdan(vt);
adapter = new CuzdanAdapter(getActivity(),cuzdanModels,cuzdanList);
 

В этот момент cuzdanList пусто. Очевидно, что вам нужно иметь точно такое же количество предметов, cuzdanList как и у вас, cuzdanModels а этого не происходит. На момент аварии List<cuzdanModels> имеет более 0 элементов и List<Datum> все еще пуст.

Тот факт, что вы ссылаетесь на List<CuzdanModel> as cuzdanList и List<Datum> as mData в адаптере, но вызываете конструктор адаптера, используя cuzdanList as List<Datum> , может быть частью вашей проблемы.

Комментарии:

1. Извините, сэр, я не совсем понял, что вы имеете в виду. Что вы можете мне предложить? Я ничего не могу поделать, у меня связаны руки.

2. Я понятия не имею, что должно означать «у меня связаны руки». Это ваш код, вы можете делать все, что захотите. В любом случае, вам нужно убедиться, что 2 списка, которые вы передаете своему адаптеру, содержат одинаковое количество элементов. У них в одном списке не более нуля элементов, а другой список пуст. Исправьте это, заполнив оба списка. Либо это, либо исправьте getItemCount() метод так, чтобы он возвращал только минимальное количество элементов в обоих списках: return Math.min(cuzdanList.size(), mData.size())

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

4. Я рад, что вы смогли решить эту проблему. Если мой ответ был полезен, вы должны «принять» его, нажав на зеленую галочку рядом с ответом. Добро пожаловать в сообщество Stackoverflow.

Ответ №2:

java.lang.IndexOutOfBoundsException указывает, что вы пытаетесь получить элемент из списка (или массива, или какой-либо другой коллекции), но в списке его нет. Более конкретно, Size: 0 говорит, что в вашем списке 0 элементов, поэтому он пуст, и Index: 0 говорит, что вы пытаетесь получить первый элемент. Но список пуст, поэтому первого элемента нет, поэтому вы получаете исключение.

Вы добавили, что исключение происходит в строке 38, то есть 'Datum datum = mData.get(position); . Похоже, что в этой точке position 0 и mData пусто. Просматривая ваш код, я не нашел ни одной строки в Adapter классе , в которую вы что-то вставляете mData , вы только инициализируете это в CuzdanAdapter конструкторе. И это вызывается в строке adapter = new CuzdanAdapter(getActivity(),cuzdanModels,cuzdanList); , где cuzdanList до этого были созданы пустые две строки. Единственное место в файле фрагмента, куда вы что-либо вставляете cuzdanList , — это строка cuzdanList.addAll(list.getData()); . Но если ответ пуст, элементы не будут добавлены, и позже вы получите исключение IndexOutOfBoundsException.

Комментарии:

1. Я понимаю, что вы имеете в виду, сэр. Но это все равно не работает. Я удалил команду «cuzdanList = новый ArrayList<> ();», но ничего не произошло. Я думаю, что проблема больше, чем мои знания. Я не мог это исправить. В любом случае спасибо за ваш ответ