¿Por qué mi edición de texto no está filtrando vista de lista

aroo:

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.

salón:

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());

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=344049&siteId=1
Recomendado
Clasificación