0

辞書アプリを書いています。私の検索画面は非常にシンプルです。Activityアプリのロゴが中央に配置され、画面の下部に検索ボックスが配置されています。検索ボックスにフォーカスが入ると、ソフトキーボードがポップアップし、検索ボックスがその真上に移動します。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <ImageView android:id="@+id/search_logo"
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:src="@drawable/logo_transparent"
        android:layout_centerInParent="true"
        android:contentDescription="@string/desc_logo"
        />

    <EditText android:id="@+id/search_fld"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/textbox"
        android:inputType="text"
        android:hint="@string/search_hint"
        android:padding="10dp"
        android:layout_alignParentBottom="true"
        />

</RelativeLayout>

ユーザーが1文字でも入力するとすぐに、一致するエントリについてLuceneでクエリを実行します。検索ボックスの上部のビューを、ListView入力(または削除)されたすべての文字に対して動的に更新したいのですが、このXMLレイアウトからどのようにそれを行うことができますか?この種のデザインへの正しいアプローチは何ですか?

4

2 に答える 2

3

以下は、最終的にあなたの答えにあなたを導くであろう指針です。

  1. textwatcher検索語を書き込むエディットフィールドにを追加します。

     txtSearch.addTextChangedListener(textWatcher);
    
  2. textwatcherafterTextChangedの方法では、検索結果を除外するために、検索フィールドに入力された文字をパラメーターとして使用するフィルターが必要になります。

    private TextWatcher textWatcher = new TextWatcher() {
    
    @Override
    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        // TODO Auto-generated method stub
    }
    
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
        // TODO Auto-generated method stub
    }
    
    @Override
    public void afterTextChanged(Editable s) {
    
        adapter.getFilter().filter(s);
        adapter.notifyDataSetChanged(); 
    }
    };
    
  3. 以下は、フィルタリングの目的で使用したクラスです。

    /*
     * Class that implements filtering functionality.
     */
    public class MyFilter extends Filter {
        public MyFilter(ArrayList<CustomerListRow> data) {
        }
    
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
    
            constraint = constraint.toString().toLowerCase();
            FilterResults result = new FilterResults();
    
            if (constraint != null && constraint.toString().length() > 0) {
                ArrayList<CustomerListRow> filt = new ArrayList<CustomerListRow>();
    
                for (int i = 0; i < arrayListCopy.size(); i++) {
                    CustomerListRow each = arrayListCopy.get(i);
                    if (each.getName().toLowerCase().contains(constraint)) {
                        filt.add(each);
                    }
                }
                result.count = filt.size();
                result.values = filt;
            } else {
                synchronized (this) {
                    result.count = arrayListCopy.size();
                    result.values = arrayListCopy;
                }
            }
    
            return result;
        }
    
        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            ArrayList<CustomerListRow> filtered = (ArrayList<CustomerListRow>) results.values;
            clear();
    
            int size = filtered.size();
            for (int i = 0; i < size; i++) {
                add(filtered.get(i));
            }
            notifyDataSetInvalidated();
        }
    }
    
  4. 完全なリストを渡すアダプターを作成する必要があります。このアダプターは、最終的にフィルターに渡されます。以下は私のアダプタークラスのコンストラクターです。

            public MyAdapter(Context context, int textViewResourceId,
                List<CustomerListRow> objects) {
            super(context, textViewResourceId, objects);
            this.context = context;
            inflator = (LayoutInflater) context
                    .getSystemService(LAYOUT_INFLATER_SERVICE);
            list = (ArrayList<CustomerListRow>) objects;
            filter = new MyFilter(list);
            arrayListCopy.addAll(list);
        } 
    
于 2012-10-18T09:53:04.913 に答える
1

解決策はもっと簡単なようです。まず、のを作成しTextWatcherますEditText。次に、内部onTextChanged()で、これはあなたがすることです:

  1. メソッドが呼び出されるたびにLuceneクエリを作成します。結果を取得します。
  2. アダプターを呼び出しclear()ます。
  3. すべての結果をアダプターに追加します。
  4. アダプターを呼び出しnotifyDataSetChanged()ます。
于 2012-10-29T04:51:00.850 に答える