javaandroidlistview

Java android listView search


Hi I want to search in my ListView , I write a adapter, In Activity I have a listView , EditText. When I remove a search everythink work corretly : this is my Adapter:

 public class NewDataAdapter extends ArrayAdapter<DataRow> {
    
        private Context context;
        private ArrayList<DataRow> rows;
        private LayoutInflater inflater;
        private Page page;
        private boolean[] sList;
        private String[] columnNames;
        public static String objectId;
        public static String lineId;
        private List<DataRow> searchList = null;
    
        public NewDataAdapter(Context context, ArrayList<DataRow> rows, Page page) {
            super(context, 0, rows);
            this.context = context;
            this.rows = new ArrayList<>();
            this.rows.addAll(rows);
            this.page = page;
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            this.sList = page.getSTypesList();
            this.columnNames = page.getColumnsDataNames();
            this.searchList = rows;
        }
    
        public class ViewHolder {
            TextView name;
            TextView date;
        }
    
        public View getView(final int position, View view, ViewGroup parent) {
            final ViewHolder holder;
    //        DataRow row = rows.get(position);
            if (view == null) {
                holder = new ViewHolder();
                view = inflater.inflate(R.layout.listview_item, null);
                holder.name = (TextView) view.findViewById(R.id.id_name);
                holder.date = (TextView) view.findViewById(R.id.id_date);
                view.setTag(holder);
            } else {
                holder = (ViewHolder) view.getTag();
            }
                holder.name.setText(rows.get(position).getValues().get(0));
                holder.date.setText(rows.get(position).getValues().get(1));
    
            if (position == MainActivity.selectedListItem) {
                view.setBackgroundColor(context.getResources().getColor(R.color.listSelectedItem));
                objectId = rows.get(position).getValues().get(5);
                lineId = rows.get(position).getValues().get(0);
                Log.e("wartosci ", objectId + ", " + lineId);
            } else {
                if (position % 2 == 0) {
                    view.setBackgroundColor(Color.LTGRAY);
                } else {
                    view.setBackgroundColor(Color.WHITE);
                }
            }
    
            return view;
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        public void addRow(DataRow row) {
            this.rows.add(row);
        }
    
        @Override
        public DataRow getItem(int itemIndex) {
            return rows.get(itemIndex);
        }
    
        public int getSize() {
            return rows.size();
        }
    
        public void filter(String charText) {
            charText = charText.toLowerCase(Locale.getDefault());
            rows.clear();
            if (charText.length() == 0) {
                rows.addAll(searchList);
            } else {
                for (DataRow wp : searchList) {
                    if (wp.getValueFromCol("nazwa").toLowerCase(Locale.getDefault())
                            .contains(charText)) {
                        rows.add(wp);
                    }
                }
            }
            notifyDataSetChanged();
        }
    }

In activity I have :

 inputSearch = (EditText) findViewById(R.id.inputSearch);

        inputSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
               String text = inputSearch.getText().toString().toLowerCase(Locale.getDefault());
                myAdapter.filter(text);
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });

And when I use a search my apk is crash. In log I have :

                                                                            java.lang.IndexOutOfBoundsException: Invalid index 4, size is 4

in line :

    holder.name.setText(rows.get(position).getValues().get(0));

I don't have idea whaT I do wrong


Solution

  • add

    @Override
    public int getCount() {
        return rows.size();
    }
    

    in your ArrayAdapter