#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<> ();», но ничего не произошло. Я думаю, что проблема больше, чем мои знания. Я не мог это исправить. В любом случае спасибо за ваш ответ