なぜ私のエディットテキストは、リストビューをフィルタリングされていません

Aroo:

私は、データベースから移入された私のリストビューをフィルタ処理しようとしています。ここに活動の私のコードです

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を呼び出すことによって、人々の配列を初期化する必要があります。SearchActivityインチ

。最後に、SearchActivityで、SearchActivity.this.myAdapter.getFilter()フィルタ(arg0に)を交換。とともに

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=344046&siteId=1