Ошибка IndexOutOfBounds при использовании фильтруемого в представлении списка в Android Studio - PullRequest
0 голосов
/ 03 ноября 2019

В настоящее время я внедряю метод фильтра по типу с использованием фильтруемого, чтобы отображать только грузовые тележки с определенной спецификацией типа. Приложение вылетает при изменении текста в 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;
}

}

...