Страницы

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

воскресенье, 22 декабря 2019 г.

Поиск по listView android

#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 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

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

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