6

私はListViewとを持っていEditTextます。コンテンツをフィルタリングするために実装addTextChangedListenerします。EditTextListView

leftList.setTextFilterEnabled(true);
et_search.addTextChangedListener(filterTextWatcher);

そして、次のTextWatcherとおりです。

private TextWatcher filterTextWatcher = new TextWatcher() {

    public void afterTextChanged(Editable s) {
    }

    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    public void onTextChanged(CharSequence s, int start, int before,
            int count) {

         if (watcherAdapter==null) {
             return;
         }

         watcherAdapter.getFilter().filter(s);

         Log.e(TAG, "OnTextChange: " + s + " start: " + start +
         " before: " + before + " count: " + count + " adapter: " +
         watcherAdapter.getCount());    

    }
};

調子:

  1. に 10 個のアイテムがありListViewます。

質問:

  1. 最初の文字を最初に入力すると、返されたフィルター結果の数ではなく、wで (初期値として) がwatcherAdapter.getCount()返されるのはなぜですか? )は、表示された結果のクリックが遅いようです。10ListViewatcherAdapter.getCount(ListView
  2. に入力したときに一致結果がない場合に表示"No Result"するにはどうすればよいですか?ListViewEditText
4

5 に答える 5

3

メッセージを表示するリストの上または下のレイアウトに TextView を追加する方がクリーンです。

<TextView 
android:id="@+id/noResultsFoundView" 
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="No result"
android:visibility="gone"
/>

結果が得られたら、可視性を GONE に設定します。結果がない場合は、VISIBLE に設定します。

これをリッスンするには、カスタム フィルターを実装するか、少なくともメソッドをオーバーライドします。

publishResults(CharSequence constraint, FilterResults results)

正しい更新されたカウントが FilterResults パラメータに渡されます。

publishResults では、アクティビティからメソッドを呼び出して、noResultsFoundView の可視性を更新します。アクティビティへのアクセス方法は、フィルターの場所によって異なります。アクティビティの内部クラスにある場合は簡単です。それ以外の場合は、たとえば、アクティビティをパラメーターとして渡してアダプターをインスタンス化し、インスタンス変数として保存します。

于 2012-05-04T10:59:53.963 に答える
2

もちろん、フィルタ可能なリストに結果を表示しないことも可能です。以下のコードを参照してください

 @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.home, menu);

        MenuItem searchItem = menu.findItem(R.id.menu_search);
        final AppCompatEditText searchView = (AppCompatEditText) MenuItemCompat.getActionView(searchItem);
        if (searchView != null) {
            searchView.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                                          int arg3) {
                    if(mAdapter==null)
                        return;
                        mAdapter.getFilter().filter(arg0.toString());
                        if(mAdapter.getItemCount()<1){
                            listView.setVisibility(View.GONE);
                            txtEmptyList.setVisibility(View.VISIBLE);
                        }else{
                            listView.setVisibility(View.VISIBLE);
                            txtEmptyList.setVisibility(View.GONE);
                        }
                }

                @Override
                public void beforeTextChanged(CharSequence arg0, int arg1,
                                              int arg2, int arg3) {
                }

                @Override
                public void afterTextChanged(Editable arg0) {

                }
            });
        }
        MenuItemCompat.setOnActionExpandListener(searchItem, this);
        MenuItemCompat.setActionView(searchItem, searchView);
        super.onCreateOptionsMenu(menu, inflater);
    }
于 2016-12-21T07:21:06.247 に答える
1
if(!fillMaps.isEmpty())
            {
            SimpleAdapter adapter = new SimpleAdapter(
                    WorldClockActivity.this, fillMaps, R.layout.grid_item,
                    from, to);
            lv1.setAdapter(adapter);
            }
            else
            {      String[] emptyList = new String[] {"No record found"};
            lv1.setAdapter(new ArrayAdapter<String>(WorldClockActivity.this,R.layout.list_item, emptyList));
            }

上記のコードでこれを行うには2つのアダプターを使用する必要があります.2つのアダプターを使用します.マップが空の場合、マップ内のアイテムが見つかったときに最初に1つが設定されます.それから別のアダプターを追加する必要があります.私はそれをelse状態にしました.そしてそれはうまくいっています。解決策が得られたことを願っています。

于 2011-05-27T05:51:33.563 に答える
0

私が最後に使用する唯一の解決策は、カスタム検索フィルターを実行することです。単語を分割し、トークン化し、一致した場合は、リストへのアダプターとして配列に配置します。そしてそれは私が望むように動作します

于 2011-12-07T03:07:08.623 に答える