У меня проблемы со следующим кодом. Я пытаюсь фильтровать ListView. Содержимое загружается с Firebase, но это не должно быть источником проблемы. Я хочу, чтобы содержимое списка было обновлено во время записи пользователем. Это действительно работает, но проблема заключается в том, когда пользователь удаляет символ: список обновляется только с результатом исследования прецедента. Так, например, с первоначальным списком: «Мадрид», «В основном». Если пользователи напишут «Безумный», «Мадрид» будет единственным, который будет отображаться. Но когда он удалит «d» («Ma» влево), «Mainly» не будет отображаться.Фильтр по списку не работает должным образом
Странно то, что когда я не использую clear() и addAll (values) в publishResult из моего адаптера, удаление символов работает, но фильтрация выполняется только по количеству элементов. Например, для списка из 100 элементов, если 14 совпадают, отображаются только первые 14 элементов, а не 14 соответствующих элементов.
Если кто-нибудь увидит, почему я так с этим кодом, ответ будет приветствоваться :)
адаптер
import android.content.Context;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.util.Log;
import java.util.ArrayList;
public class AdapterCourseList extends ArrayAdapter<String> {
public Context context;
public ArrayList<String> values;
final public ArrayList<String> originalValues;
private static final String TAG = AdapterCourseList.class.getSimpleName();
public AdapterCourseList(Context context, ArrayList<String> valeurs){
super(context, android.R.layout.simple_list_item_1, valeurs);
this.context = context;
this.values = valeurs;
this.originalValues = valeurs;
}
@Override
public int getCount(){
return values.size();
}
public Filter getFilter() {
Filter mfilter = new Filter() {
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
values = (ArrayList<String>)results.values;
clear();
notifyDataSetChanged();
addAll(values);
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults result = new FilterResults();
ArrayList<String> res = new ArrayList<>();
for(String d: originalValues){
Log.d(TAG,d);
if(d.toUpperCase().contains(constraint.toString().toUpperCase())){
res.add(d);
}
}
result.count = res.size();
result.values = res;
return result;
}
};
return mfilter;
}
}
активность
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import java.util.ArrayList;
public class CourseListActivity extends AppCompatActivity {
private EditText edit_search;
private AdapterCourseList adapter;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_course_list);
SimpleFirebase ref = new SimpleFirebase(this);
final ArrayList<String> stringList = ref.getCurses();
edit_search = (EditText) findViewById(R.id.edit_search);
listView = (ListView) findViewById(R.id.courseList);
adapter = new AdapterCourseList(this, stringList);
listView.setAdapter(adapter);
edit_search.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) {
adapter.getFilter().filter(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
});
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String d = adapter.getItem(position);
Intent i = new Intent(CourseListActivity.this, AddFormActivity.class);
i.putExtra("Course", d);
CourseListActivity.this.setResult(1, i);
CourseListActivity.this.finish();
}
});
}
}
Не переопределяя эти методы, проблема была устранена. Спасибо ! – Fish
Фантастический! Буду признателен, если вы ответите правильно. –