我遇到以下代码的麻烦。我试图过滤ListView。内容是从Firebase下载的,但这不应该是问题的根源。我希望在用户写入时更新列表的内容。它实际上有效,但问题是当用户删除一个字符时:该列表仅使用先前研究的结果进行更新。例如,使用初始列表:" Madrid","主要是"。如果用户写了#34; Mad"," Madrid"将是唯一一个被展示的人。但是当他将删除" d" (" Ma" left),"主要"不会被展示。
一个奇怪的事情是,当我不在我的适配器的publishResult中使用clear()和addAll(值)时,删除字符有效,但过滤仅在多个元素中完成。例如,对于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();
}
});
}
}
答案 0 :(得分:0)
你在ArrayAdapter
覆盖了所有这些方法 - 你可能没有。
ArrayAdapter
已经实现Filterable
并将返回Filter
,它会像您一样执行不区分大小写的比较。你应该尝试使用默认的实现,因为它很有可能做你想做的事。
问题出现是因为clear()
和addAll()
在ArrayAdapter
的内部列表上运行。但是,您使用自己的getCount()
列表,因此您的适配器有一些分裂的个性。如果您需要覆盖方法,请尝试扩展BaseAdapter
;你会有更多的代码行,但是所有的状态来自哪里都会更清楚。