#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 ArrayListmList; 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
Комментариев нет:
Отправить комментарий