Страницы

Поиск по вопросам

пятница, 16 ноября 2018 г.

Поиск по listView android

Есть задача реализовать поиск по 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); } }


Ответ

Для того, чтоб настроить свой фильтр, нужно решить некую последовательность:
Создать свой custom адаптер. Привязать к нему интерфейс Filterable Настроить метод getFilter() под себя.
Я сделал рабочий пример, для того чтоб вы могли потестить:
Кастомный адаптер:
public class myAdapter extends ArrayAdapter implements 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

Комментариев нет:

Отправить комментарий