Я новичок в разработке Android и попытался внедрить SearchView вместе с переработкой для отображения и фильтрации ресторанов. Однако, когда я прокручиваю вниз до нижней части перечисленных ресторанов, приложение вылетает за исключением < /p>
java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
at java.util.ArrayList.get(ArrayList.java:437)
at com.example.myprogram.SearchAdapter.onBindViewHolder(SearchAdapter.java:37)
at com.example.myprogram.SearchAdapter.onBindViewHolder(SearchAdapter.java:15)
at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
at androidx.recyclerview.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:288)
at androidx.recyclerview.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:345)
at androidx.recyclerview.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:361)
at androidx.recyclerview.widget.GapWorker.prefetch(GapWorker.java:368)
at androidx.recyclerview.widget.GapWorker.run(GapWorker.java:399)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8663)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)
< /code>
my searchAdapter class: < /p>
package com.example.myprogram;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
public class SearchAdapter extends RecyclerView.Adapter {
protected ArrayList searchList = new ArrayList();
Context context;
public SearchAdapter(ArrayList searchList, Context context) {
this.searchList = searchList;
this.context = context;
}
@NonNull
@Override
public SearchViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.search_item, null, false);
return new SearchViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SearchViewHolder holder, int position) {
holder.search_title.setText(searchList.get(position).getName());
holder.search_desc.setText(searchList.get(position).getDescription());
holder.searchViewImage.setImageDrawable(searchList.get(position).getImage());
}
public void setFilteredList(ArrayList filteredList){
this.searchList = filteredList;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return AppManager.getNumOfRestaurants();
}
public class SearchViewHolder extends RecyclerView.ViewHolder {
private TextView search_title;
private TextView search_desc;
private ConstraintLayout rowItem;
private ImageView searchViewImage;
public SearchViewHolder(@NonNull View itemView) {
super(itemView);
search_title = itemView.findViewById(R.id.visibleSearchTitle);
search_desc = itemView.findViewById(R.id.searchDescription);
this.searchViewImage = itemView.findViewById(R.id.searchListImage);
}
}
}
< /code>
My Search Activity < /p>
package com.example.myprogram;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.core.content.res.ResourcesCompat;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class Search extends AppCompatActivity {
protected ArrayList searchList;
protected RecyclerView searchRecyclerView;
protected SearchView searchBar;
SearchAdapter searchAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.searchpage);
searchRecyclerView = findViewById(R.id.search_list);
searchRecyclerView.setItemAnimator(new DefaultItemAnimator());
searchRecyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
searchList = new ArrayList();
searchList.add(new Restaurant("McDonald's", "I love McDonald's", ResourcesCompat.getDrawable(getResources(), R.drawable.testimage2, null)));
searchList.add(new Restaurant("Burger King", "I love whoppers", ResourcesCompat.getDrawable(getResources(), R.drawable.testimage2, null)));
searchList.add(new Restaurant("KFC", "I love KFC", ResourcesCompat.getDrawable(getResources(), R.drawable.testimage2, null)));
searchList.add(new Restaurant("Popeye's", "I love Popeyes", ResourcesCompat.getDrawable(getResources(), R.drawable.testimage2, null)));
searchAdapter = new SearchAdapter(searchList, Search.this);
searchAdapter.notifyDataSetChanged();
searchRecyclerView.setLayoutManager(new LinearLayoutManager(this));
searchRecyclerView.setAdapter(searchAdapter);
searchBar = findViewById(R.id.search_bar);
searchBar.clearFocus();
searchBar.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
filterSearch(newText);
return true;
}
});
}
private void filterSearch(String filter) {
ArrayList filterSearch = new ArrayList();
for (Restaurant restaurant : searchList){
if (restaurant.getName().toLowerCase().contains(filter.toLowerCase())){
filterSearch.add(restaurant);
}
}
if (filterSearch.isEmpty()){
Toast.makeText(this, "No restaurants found", Toast.LENGTH_SHORT).show();
}
else{
searchAdapter.setFilteredList(filterSearch);
}
}
}
< /code>
Пожалуйста, дайте мне знать, в чем проблема! Любая помощь будет очень оценена.
Подробнее здесь: https://stackoverflow.com/questions/797 ... cyclerview
Indexoutofboundsexception при прокрутке до конца переработки ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1759475354
Anonymous
Я новичок в разработке Android и попытался внедрить SearchView вместе с переработкой для отображения и фильтрации ресторанов. Однако, когда я прокручиваю вниз до нижней части перечисленных ресторанов, приложение вылетает за исключением < /p>
java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
at java.util.ArrayList.get(ArrayList.java:437)
at com.example.myprogram.SearchAdapter.onBindViewHolder(SearchAdapter.java:37)
at com.example.myprogram.SearchAdapter.onBindViewHolder(SearchAdapter.java:15)
at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
at androidx.recyclerview.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:288)
at androidx.recyclerview.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:345)
at androidx.recyclerview.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:361)
at androidx.recyclerview.widget.GapWorker.prefetch(GapWorker.java:368)
at androidx.recyclerview.widget.GapWorker.run(GapWorker.java:399)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8663)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)
< /code>
my searchAdapter class: < /p>
package com.example.myprogram;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
public class SearchAdapter extends RecyclerView.Adapter {
protected ArrayList searchList = new ArrayList();
Context context;
public SearchAdapter(ArrayList searchList, Context context) {
this.searchList = searchList;
this.context = context;
}
@NonNull
@Override
public SearchViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.search_item, null, false);
return new SearchViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SearchViewHolder holder, int position) {
holder.search_title.setText(searchList.get(position).getName());
holder.search_desc.setText(searchList.get(position).getDescription());
holder.searchViewImage.setImageDrawable(searchList.get(position).getImage());
}
public void setFilteredList(ArrayList filteredList){
this.searchList = filteredList;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return AppManager.getNumOfRestaurants();
}
public class SearchViewHolder extends RecyclerView.ViewHolder {
private TextView search_title;
private TextView search_desc;
private ConstraintLayout rowItem;
private ImageView searchViewImage;
public SearchViewHolder(@NonNull View itemView) {
super(itemView);
search_title = itemView.findViewById(R.id.visibleSearchTitle);
search_desc = itemView.findViewById(R.id.searchDescription);
this.searchViewImage = itemView.findViewById(R.id.searchListImage);
}
}
}
< /code>
My Search Activity < /p>
package com.example.myprogram;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.core.content.res.ResourcesCompat;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class Search extends AppCompatActivity {
protected ArrayList searchList;
protected RecyclerView searchRecyclerView;
protected SearchView searchBar;
SearchAdapter searchAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.searchpage);
searchRecyclerView = findViewById(R.id.search_list);
searchRecyclerView.setItemAnimator(new DefaultItemAnimator());
searchRecyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
searchList = new ArrayList();
searchList.add(new Restaurant("McDonald's", "I love McDonald's", ResourcesCompat.getDrawable(getResources(), R.drawable.testimage2, null)));
searchList.add(new Restaurant("Burger King", "I love whoppers", ResourcesCompat.getDrawable(getResources(), R.drawable.testimage2, null)));
searchList.add(new Restaurant("KFC", "I love KFC", ResourcesCompat.getDrawable(getResources(), R.drawable.testimage2, null)));
searchList.add(new Restaurant("Popeye's", "I love Popeyes", ResourcesCompat.getDrawable(getResources(), R.drawable.testimage2, null)));
searchAdapter = new SearchAdapter(searchList, Search.this);
searchAdapter.notifyDataSetChanged();
searchRecyclerView.setLayoutManager(new LinearLayoutManager(this));
searchRecyclerView.setAdapter(searchAdapter);
searchBar = findViewById(R.id.search_bar);
searchBar.clearFocus();
searchBar.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
filterSearch(newText);
return true;
}
});
}
private void filterSearch(String filter) {
ArrayList filterSearch = new ArrayList();
for (Restaurant restaurant : searchList){
if (restaurant.getName().toLowerCase().contains(filter.toLowerCase())){
filterSearch.add(restaurant);
}
}
if (filterSearch.isEmpty()){
Toast.makeText(this, "No restaurants found", Toast.LENGTH_SHORT).show();
}
else{
searchAdapter.setFilteredList(filterSearch);
}
}
}
< /code>
Пожалуйста, дайте мне знать, в чем проблема! Любая помощь будет очень оценена.
Подробнее здесь: [url]https://stackoverflow.com/questions/79781409/indexoutofboundsexception-when-scrolling-to-end-of-recyclerview[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия