我遇到了下列代码的麻烦。我试图过滤ListView。内容是从Firebase下载的,但这不应该是问题的根源。我希望在用户写入时更新列表的内容。它实际上工作,但问题是当用户删除一个字符:该列表只会更新与先前的研究结果。例如最初的清单:“马德里”,“主要”。如果用户写入“疯狂”,则将仅显示“马德里”。但是当他删除“d”(“Ma”左侧)时,“Mainly”将不会显示。在列表上过滤器无法正常工作
奇怪的是,当我不在我的适配器中使用publishResult中的clear()和addAll(values)时,删除字符有效,但过滤仅在多个元素中完成。例如,对于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
太棒了!如果您接受我的回答是正确的,我将不胜感激。 –