#java #android #listview
Есть задача реализовать поиск по listViev, но данный код адекватно ищет только по
первым символам, если ввести символы которые в словах находятся в средине или конце
- то он вообще не дает результатов. Если нужно привести дополнительный код - говорите
я добавлю.
mInputSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user changed the Text
ListFragment.this.mAdapter.getFilter().filter(cs);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
ListFragment.java
public class ListFragment extends Fragment {
private ListView mListView;
private EditText mInputSearch;
private ArrayList mList;
private ArrayAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mList = new ArrayList();
fillArray();
mAdapter = new ArrayAdapter(getActivity().getApplicationContext(),R.layout.item_list,
mList);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.activity_list, container, false);
mInputSearch = (EditText) v.findViewById(R.id.inputSearch);
mListView = (ListView) v.findViewById(R.id.listView);
mListView.setAdapter(mAdapter);
return v; }
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mInputSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user changed the Text
ListFragment.this.mAdapter.getFilter().filter(cs);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
}
private void fillArray() {
mList.add("Lorem");
mList.add("Ipsum");
mList.add("Dolor");
mList.add("Sit");
mList.add("Amet");
mList.add("Consectetur");
mList.add("Adipiscing");
mList.add("Elit");
mList.add("Fusce");
mList.add("Pharetra");
mList.add("Luctus");
mList.add("Sodales");
Collections.sort(mList);
}
}
Ответы
Ответ 1
Для того, чтоб настроить свой фильтр, нужно решить некую последовательность: Создать свой custom адаптер. Привязать к нему интерфейс Filterable Настроить метод getFilter() под себя. Я сделал рабочий пример, для того чтоб вы могли потестить: Кастомный адаптер: public class myAdapter extends ArrayAdapterimplements Filterable { private List allModelItemsArray; private List filteredModelItemsArray; private Activity context; private ModelFilter filter; private LayoutInflater inflater; public myAdapter(Activity context, ArrayList list) { super(context, R.layout.list_item, list); this.context = context; this.allModelItemsArray = new ArrayList (); allModelItemsArray.addAll(list); this.filteredModelItemsArray = new ArrayList (); filteredModelItemsArray.addAll(allModelItemsArray); inflater = context.getLayoutInflater(); getFilter(); } @Override public Filter getFilter() { if (filter == null){ filter = new ModelFilter(); } return filter; } static class ViewHolder { protected TextView text; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; String m = filteredModelItemsArray.get(position); ViewHolder viewHolder = null; if (convertView == null) { view = inflater.inflate(R.layout.list_item, null); viewHolder = new ViewHolder(); viewHolder.text = (TextView) view.findViewById(R.id.tvItem); view.setTag(viewHolder); } else { view = convertView; viewHolder = ((ViewHolder) view.getTag()); } viewHolder.text.setText(m); return view; } private class ModelFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { constraint = constraint.toString().toLowerCase(); FilterResults result = new FilterResults(); if(constraint.toString().length() > 0) { ArrayList filteredItems = new ArrayList (); for(int i = 0, l = allModelItemsArray.size(); i < l; i++) { String m = allModelItemsArray.get(i); if(m.toLowerCase().contains(constraint)) filteredItems.add(m); } result.count = filteredItems.size(); result.values = filteredItems; } else { synchronized(this) { result.values = allModelItemsArray; result.count = allModelItemsArray.size(); } } return result; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { filteredModelItemsArray = (ArrayList )results.values; notifyDataSetChanged(); clear(); for(int i = 0, l = filteredModelItemsArray.size(); i < l; i++) add(filteredModelItemsArray.get(i)); notifyDataSetInvalidated(); } } } MainActivity.class public class MainActivity extends AppCompatActivity { ListView lv; EditText editText; myAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv); editText = (EditText) findViewById(R.id.editText); ArrayList values = new ArrayList<>(); for (int i = 0; i < 25; i++) { values.add("Item:" + i); } adapter = new myAdapter(this, values); lv.setAdapter(adapter); editText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { adapter.getFilter().filter(s.toString()); } }); } } activity_main.xml list_item.xml
Комментариев нет:
Отправить комментарий