Есть задача реализовать поиск по 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
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mList = new ArrayList
mAdapter = new ArrayAdapter
}
@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
private List
public myAdapter(Activity context, ArrayList
@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
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
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
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
Комментариев нет:
Отправить комментарий