[英]Why my edit text is not filtering listview
我正在嘗試過濾從數據庫填充的列表視圖。 這是我的活動代碼
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
}
});
列表視圖基於自定義數組適配器類
public class MyAdapter extends ArrayAdapter {
List list = new ArrayList();
public MyAdapter(@NonNull Context context, @LayoutRes int resource) {
super(context, resource);
}
@Override
public void add(@Nullable Object object) {
super.add(object);
list.add(object);
}
@Override
public int getCount() {
return list.size();
}
@Nullable
@Override
public Object getItem(int position) {
return list.get(position);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.list_items_layout,null);
Typeface customFont = Typeface.createFromAsset(this.getContext().getAssets(), "faruma.ttf");
TextView _id = (TextView) convertView.findViewById(R.id.id_here);
TextView _name = (TextView) convertView.findViewById(R.id.name_here);
_name.setTypeface(customFont);
Person person = (Person) list.get(position);
_id.setText(person.getId());
_name.setText(person.getName());
return convertView;
}
當我在編輯文本中輸入一個詞時,列表視圖沒有過濾。
PS:我對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(); 來初始化 people 數組; 在搜索活動中。
最后,在 SearchActivity 中,替換 SearchActivity.this.myAdapter.getFilter().filter(arg0); 和
SearchActivity.this.myAdapter.filter(arg0.toString());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.