Java 为什么我的编辑文本没有过滤listview
我正在尝试筛选从数据库填充的listview。 这是我的活动代码Java 为什么我的编辑文本没有过滤listview,java,android,listview,Java,Android,Listview,我正在尝试筛选从数据库填充的listview。 这是我的活动代码 listView = (ListView) findViewById(R.id.list1); listView.setTextFilterEnabled(true); myAdapter = new MyAdapter(SearchActivity.this, R.layout.list_items_layout); listView.setAdapter(myAdapter); list =
listView = (ListView) findViewById(R.id.list1);
listView.setTextFilterEnabled(true);
myAdapter = new MyAdapter(SearchActivity.this, R.layout.list_items_layout);
listView.setAdapter(myAdapter);
list = new ArrayList<>();
mDBHelper = new DatabaseHelper(SearchActivity.this);
sqLiteDatabase = mDBHelper.getReadableDatabase();
cursor = mDBHelper.getAll(sqLiteDatabase);
if(cursor.moveToFirst()){
do{
String id, name, email, contact, fav, cat, audio, count;
id = cursor.getString(0);
name = cursor.getString(1);
email = cursor.getString(2);
contact = cursor.getString(3);
fav = cursor.getString(4);
cat = cursor.getString(5);
audio = cursor.getString(6);
count = cursor.getString(7);
Person person = new Person(id,name,email,contact,fav,cat, audio, count);
myAdapter.add(person);
list.add(person);
} while (cursor.moveToNext());
}
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Person person = list.get(position);
Intent intent = new Intent(SearchActivity.this, ReceiveDataActivity.class);
intent.putExtra("KEY_ID", person.getId());
intent.putExtra("NAME", person.getName());
intent.putExtra("EMAIL", person.getEmail());
intent.putExtra("CONTACT", person.getContact());
intent.putExtra("FAVORITE", person.getFav());
intent.putExtra("AUDIO", person.getAudio());
intent.putExtra("COUNT", person.getCount());
startActivity(intent);
}
});
SearchButton=(Button)findViewById(R.id.searchButton);
searchName=(EditText)findViewById(R.id.editText);
searchName.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
SearchActivity.this.myAdapter.getFilter().filter(arg0);
myAdapter.notifyDataSetChanged();
}
@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
}
});
当我在编辑文本中键入单词时,listview不会过滤
附言:我对Android编程(java)非常陌生。我可能不理解这个解释,但如果有任何帮助,我将不胜感激。为适配器使用默认过滤器有点麻烦,因为您需要创建一个内部类,并重写几个方法。在适配器中实现以下方法更容易、可读性更强:
public void filter(String charText) {
list.clear(); // clear list
charText = charText.toLowerCase();
if (charText.length() == 0) {
list.addAll(people); // restore original list if no filter is applied
} else {
for (Object item : people) {
Person person = (Person) item;
if (person.getName().toLowerCase().contains(charText)) {
list.add(person); // add item to filtered list if contains string
}
}
}
notifyDataSetChanged();
}
您还应该在适配器中创建第二个arrayList来存储原始项的副本,并创建一个方法来初始化它:
private List people = new ArrayList();
public void initPeople() {
people.addAll(list); // copies original list to people list
}
从数据库填充列表后,应该初始化人员数组
通过调用myAdapter.initPeople();在搜索活动中
最后,在SearchActivity中,替换SearchActivity.this.myAdapter.getFilter().filter(arg0);与
我确实看到您试图从UI线程上的DB加载数据,这会使您的应用程序变得迟钝,触发ANR,等等on@EpicPandaForce有什么简单的方法可以做到这一点吗?很有魅力。
private List people = new ArrayList();
public void initPeople() {
people.addAll(list); // copies original list to people list
}
SearchActivity.this.myAdapter.filter(arg0.toString());