Почему мой текст редактирования не фильтрует просмотр списка - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь отфильтровать мой список, который заполняется из базы данных. Вот мой код активности

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). Возможно, я не понимаю объяснения, но я буду очень признателен за любую помощь.

1 Ответ

1 голос
/ 22 марта 2020

Использование фильтра по умолчанию для адаптера немного обременительно, так как вам нужно создать внутренний класс и переопределить несколько методов. В адаптере гораздо проще и удобочитаемее реализовать следующий метод:

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
 }

И после того, как ваш список заполнен из базы данных, вы должны инициализировать массив people, вызвав myAdapter.initPeople (); в поисковой активности.

Наконец, в SearchActivity замените SearchActivity.this.myAdapter.getFilter (). Filter (arg0); с

SearchActivity.this.myAdapter.filter(arg0.toString());
...