В настоящее время я внедряю метод фильтра по типу с использованием фильтруемого, чтобы отображать только грузовые тележки с определенной спецификацией типа. Приложение вылетает при изменении текста в EditText (в этом случае я набрал «m», чтобы отфильтровать грузовики типа «мексиканский»), и выдается следующая ошибка:
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.foodtrucker, PID: 4776
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.get(ArrayList.java:411)
at com.autumn.foodtrucker.TruckListAdapter.getView(TruckListAdapter.java:68)
at android.widget.AbsListView.obtainView(AbsListView.java:2363)
at android.widget.ListView.measureHeightOfChildren(ListView.java:1326)
at android.widget.ListView.onMeasure(ListView.java:1233)
at android.view.View.measure(View.java:19857)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
at androidx.appcompat.widget.LinearLayoutCompat.measureChildBeforeLayout(LinearLayoutCompat.java:1377)
at androidx.appcompat.widget.LinearLayoutCompat.measureVertical(LinearLayoutCompat.java:661)
at androidx.appcompat.widget.LinearLayoutCompat.onMeasure(LinearLayoutCompat.java:551)
at android.view.View.measure(View.java:19857)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:19857)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
at android.view.View.measure(View.java:19857)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:689)
at android.view.View.measure(View.java:19857)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2275)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1366)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1619)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6337)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
at android.view.Choreographer.doCallbacks(Choreographer.java:686)
at android.view.Choreographer.doFrame(Choreographer.java:621)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Вот onCreateиз действия списка грузовиков, где я добавляю слушателя:
public class TruckListActivity extends ListActivity implements AdapterView.OnItemSelectedListener {
private TruckListAdapter tAdapter;
private ArrayAdapter<String> arrAdapter;
public ArrayList<Truck> truckList = new ArrayList<Truck>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set the activity layout xml file.
setContentView(R.layout.activity_truck_list);
filter = (Spinner)findViewById(R.id.spinner);
arrAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, paths);
arrAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
filter.setAdapter(arrAdapter);
filter.setOnItemSelectedListener(this);
typeFilter = (Spinner)findViewById(R.id.spinner2);
arrAdapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, typePaths);
arrAdapter2.setDropDownViewResource(android.R.layout.simple_spinner_item);
typeFilter.setAdapter(arrAdapter2);
typeFilter.setOnItemSelectedListener(this);
// TEST DATA -- WILL REPLACE WHEN DB MAPPING FIGURED OUT
Truck truck = new Truck(
"Boka Tako",
"green",
1,
4,
"1301 Roseneath Rd, Richmond, VA 23230",
"Mexican");
Truck truck2 = new Truck(
"Return of the Mac",
"yellow",
2,
5,
"100 E Broad St, Richmond, VA 23230",
"American");
Truck truck3 = new Truck(
"Lowco Eatery",
"green",
3,
4,
"1210 Cary St, Richmond, VA 23230",
"American");
Truck truck4 = new Truck(
"Freakin Rican",
"green",
1,
4,
"1800 Roseneath Rd, Richmond, VA 23230",
"Puerto Rican");
Truck truck5 = new Truck(
"Saladworks",
"green",
2,
4,
"1305 Clay St, Richmond, VA 23230",
"Healthy");
// Create a list data which will be displayed in inner ListView.
truckList.add(truck);
truckList.add(truck2);
truckList.add(truck3);
truckList.add(truck4);
truckList.add(truck5);
truckListFull = truckList;
// Create the ArrayAdapter use the item row layout and the list data.
tAdapter = new TruckListAdapter(this, truckList);
// Set this tAdapter to inner ListView object.
this.setListAdapter((ListAdapter) tAdapter);
EditText filterView = (EditText) findViewById(R.id.filterView);
filterView.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user changed the Text
TruckListActivity.this.tAdapter.getFilter().filter(cs);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { }
@Override
public void afterTextChanged(Editable arg0) {}
});
}
Адаптер списка грузовиков:
public class TruckListAdapter extends ArrayAdapter implements Filterable{
private Context tContext;
private List<Truck> truckList = new ArrayList<>();
/**************************************************************************
* Default Constructor
*
* @param context
* @param objects
*/
public TruckListAdapter(Context context, List objects) {
super(context, 0, objects);
tContext = context;
truckList = objects;
}
/**************************************************************************
* getView method
*
* Description: Gets the view for a row containing the information on
* a truck in the favorites list.
*
* @param position
* @param convertView
* @param parent
* @return rowView
*/
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View rowView = convertView; // row view to be returned
// inflate rowView if not null
if (rowView == null)
rowView = LayoutInflater.from(tContext).inflate(R.layout.truck_list_row, parent,false);
// get the truck object at position
System.out.println(truckList.size());
Truck curTruck = truckList.get(position);
// set up TextViews for each attribute to be displayed
TextView nameView = (TextView)rowView.findViewById(R.id.name);
nameView.setText(curTruck.getName());
// create a price identifier string
String priceStr = "";
for (int i=0; i<curTruck.getPrice(); i++)
priceStr+="$";
TextView priceView = (TextView)rowView.findViewById(R.id.price);
priceView.setText(priceStr);
TextView typeView = (TextView)rowView.findViewById(R.id.type);
typeView.setText(curTruck.getType());
TextView addressView = (TextView)rowView.findViewById(R.id.address);
addressView.setText(curTruck.getAddress());
return rowView;
}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
truckList = (List<Truck>) results.values;
notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
ArrayList<Truck> FilteredArrayNames = new ArrayList<Truck>();
// perform your search here using the searchConstraint String.
constraint = constraint.toString().toLowerCase();
for (int i = 0; i < truckList.size(); i++) {
String dataNames = truckList.get(i).getType();
if (dataNames.toLowerCase().startsWith(constraint.toString())) {
FilteredArrayNames.add(truckList.get(i));
}
}
results.count = FilteredArrayNames.size();
results.values = FilteredArrayNames;
Log.e("VALUES", results.values.toString());
return results;
}
};
return filter;
}
}