0

カスタム アダプタを使用してリストを検索する EditText コンポーネントがあります。フィルタリングされたビューが画面に残ることを除いて、正常に機能します。ユーザーが編集ボックス内のすべてのテキストを削除した場合、完全なリストが画面に戻るようにします。

私は3つのアプローチを試しました:

  1. アダプタのフィルタ クラスに条件を設定しました。FilterResultsnotifyDataSetChanged();関数に配置すると、プログラムがクラッシュします。

  2. アクティビティで EditTtext ボックスが空かどうかを検出し、 を呼び出し notifyDataSetChanged();ます。System.out.println()コンソールにテキストが表示されるため、条件は機能します。ただし、listView には影響しません。フィルタリングされたテキストのみが画面に残ります。

  3. に配置 notifyDataSetChanged();OnTextChanged()ます。これは、リストビューのリセットにも影響しません。

EditText Box が空のときにリストビューをリセットするにはどうすればよいですか?

アクティビティからのコード:

// OnCreate で

if (searchBox.toString().equals("")){
                objAdapter.notifyDataSetChanged();


            }


        searchBox.addTextChangedListener(new TextWatcher(){

                @Override
                public void afterTextChanged(Editable arg0) {
                    // Do nothing
                }

                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    // Do nothing
                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    objAdapter.getFilter().filter(s);

if (s.toString().equals("")){

                        // objAdapter.notifyDataSetChanged(); fails here 

}

                    }
                }

            });

アダプターからのコード。

    public class NewsRowAdapter extends ArrayAdapter<Item> {
    //.... code
    private class ListFilter extends Filter
        {
                @Override
                protected FilterResults performFiltering(CharSequence constraint)
                {   
                    FilterResults results = new FilterResults();
                    String prefix = constraint.toString().toLowerCase();

                    if (prefix == null || prefix.length() == 0)
                    {

                        System.out.println("editText is empty");
                        // notifyDataSetChanged(); no effect

                        ArrayList<Item> list = new ArrayList<Item>(original);
                        results.values = list;
                        results.count = list.size();


                    }
                    else
                    {
                        final ArrayList<Item> list = original;

                        int count = list.size();
                        final ArrayList<Item> nlist = new ArrayList<Item>(count);

                        for (int i=0; i<count; i++)
                        {
                            final Item pkmn = list.get(i);
                            final String value = pkmn.getName().toLowerCase();
                        if (value.startsWith(prefix))
                        {
                            nlist.add(pkmn);
                        }
                    }
                    results.values = nlist;
                    results.count = nlist.size();
                }
                return results;
            }

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                fitems = (ArrayList<Item>)results.values;

                clear();
                int count = fitems.size();
                for (int i=0; i<count; i++)
                {
                    Item pkmn = (Item)fitems.get(i);
                    add(pkmn);
                }

                if (fitems.size() > 0){
                    notifyDataSetChanged();
                } else{
                    notifyDataSetInvalidated();
                }

            }

        }
4

1 に答える 1

1

の代わりにsearchBox.toString()searchBox.getText().toString()

searchBox.toString()オブジェクトのVM参照を返しています-これは決して何にも等しくなりません

于 2012-09-30T02:29:10.717 に答える