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
add
@Override
public int getCount() {
return rows.size();
}
in your ArrayAdapter