Estoy tratando de filtrar mi vista de lista que se rellena a partir de una base de datos. Aquí está mi código de la actividad
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
}
});
la vista de lista se basa en la matriz de clase adaptador personalizado
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;
}
Cuando escribo una palabra en la vista de lista de edición de texto no está filtrando.
PS: Estoy muy muy nuevo en la programación Android (Java). Puede que no comprender la explicación pero será muy apreciada con ninguna ayuda.
Usando el filtro predeterminado para un adaptador es un engorroso poco, ya que es necesario crear una clase interna, anular y un par de métodos. Es mucho más fácil y más fácil de leer para poner en práctica el método siguiente en el adaptador:
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();
}
También debe crear un segundo arrayList en el adaptador para almacenar una copia de los elementos originales, y un método para inicializarlo:
private List people = new ArrayList();
public void initPeople() {
people.addAll(list); // copies original list to people list
}
Y después de su lista se rellena a partir de la base de datos, debe inicializar la matriz personas llamando myAdapter.initPeople (); en SearchActivity.
Por último, en SearchActivity, reemplace SearchActivity.this.myAdapter.getFilter () filtro (arg0).; con
SearchActivity.this.myAdapter.filter(arg0.toString());