2011-05-23 6 views
4

ListActivityの単純なフィルタの使用に関するいくつかのチュートリアルを読んだことがありますが、それがなぜ私にとってうまくいかないのか分かりません。 TextWatcherのonTextChanged()メソッドは、検索する正しい文字列で実行されますが、何も起こりません。私は問題がカスタムアダプターかもしれないと思うが、私はそれを動作させることができますか?カスタムArrayAdapterのListActvityフィルタ

多分あなたはそれを見ることができます:) ありがとう!

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/LinearLayout01" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    > 

    <EditText android:id="@+string/search_box" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:hint="type to filter" 
     android:inputType="text" 
     android:maxLines="1"/> 

    <ListView android:id="@+android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="0dip" 
     android:layout_weight="1"/> 

</LinearLayout> 

とリストビュー内のすべての行がlistview.xml要素である:

<?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="wrap_content"> 


    <TextView 
      android:id="@+string/playlist_title" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      <!-- some layout stuff --> /> 

    <ImageView 
     android:id="@+string/playlist_play" 
     android:src="@drawable/playlist_play" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
      <!-- some layout stuff --> /> 

    <TextView 
     android:id="@+string/playlist_queue" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
      <!-- some layout stuff --> /> 


</RelativeLayout> 

答えて

5

私は、アレイアダプタフィルタから標準フィルタを考えるのplaylist.xmlファイルがある

package com.RemoteControl; 

import com.RemoteControl.R; 

import android.app.ListActivity; 
import android.content.Context; 
import android.os.Bundle; 
import android.os.Handler; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class RemoteControlPlaylist extends ListActivity { 

    static Handler error_class_Handler; 
    static Handler viewHandler; 
    static EfficientAdapter adapter = null; 
    private static EditText filterText = null; 


    static class EfficientAdapter extends ArrayAdapter<String> { 

     public EfficientAdapter(Context context, int textViewResourceId, int playlistTitle, String[] objects) { 
      super(context, textViewResourceId, playlistTitle, objects); 

      mInflater = LayoutInflater.from(context); 
     } 

     private LayoutInflater mInflater; 

     @Override 
     public int getCount() { 
      return Settings.playlistlength; 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      ViewHolder holder; 

      if (convertView == null) 
      { 
       holder = new ViewHolder(); 

       convertView = mInflater.inflate(R.layout.listview, null); 

       holder.text = (TextView) convertView.findViewById(R.string.playlist_title); 
       holder.image = (ImageView) convertView.findViewById(R.string.playlist_play); 
       holder.queue = (TextView) convertView.findViewById(R.string.playlist_queue); 

       convertView.setTag(holder); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 


      return convertView; 
     } 


     static class ViewHolder { 
      TextView text, queue; 
      ImageView image; 
     } 

     @Override 
     public String getItem(int position) { 
      return Settings.playlist[position]; 
     } 
    } 

    private static 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) { 
      adapter.getFilter().filter(s); 
     } 

    }; 



    void initialize() 
    { 
     adapter = new EfficientAdapter(this, R.layout.listview, R.string.playlist_title, Settings.playlist); 
     setListAdapter(adapter); 

     filterText = (EditText) findViewById(R.string.search_box); 
     filterText.addTextChangedListener(filterTextWatcher); 
    } 



    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.playlist); 

     getListView().setTextFilterEnabled(true); 

     initialize(); 

     error_class_Handler = new Handler(); 
     viewHandler = new Handler(); 

     getListView().setFastScrollEnabled(true); 

    } 


    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     filterText.removeTextChangedListener(filterTextWatcher); 
    } 

} 

オブジェクトのコンストラクタに渡すものはList(配列)のみです。しかし、メソッドgetCountgetItemなどをオーバーライドするので、アダプタはコンストラクタで渡したリストを使用しません。しかし、getFilter().filter(s)と呼ぶと、それはこのリストをフィルタリングします。

クラスEfficientAdapterがあるので、それはArrayAdapterを拡張します。 EfficientAdapterを作成すると、ArrayAdapterの部分も作成され、初期化されます。コンストラクタでは、文字列の配列を渡し、ArrayAdapterのパーツはそれらを格納します。標準フィルタでは、Settings.playlistリストの代わりにフィルタがフィルタリングされます。 何ができるのですか?Settings.playlistを使用しないでください(getItem ...をオーバーライドしないでください)、コンストラクタで渡したリストのみを使用してください。私はそれがうまくいくはずだと思います。

内部ArrayAdapterには、以下のいるフィールド:

/** 
* Contains the list of objects that represent the data of this ArrayAdapter. 
* The content of this list is referred to as "the array" in the documentation. 
*/ 
private List<T> mObjects; 

private ArrayList<T> mOriginalValues; 

内部ArrayAdapterのフィルタ - 一致するArrayFilter、フィルタ、すべての値を追加するには、mObjectsに保ち、その後、ArrayAdapter 'を示す' mObjects

source codeArrayAdapter(およびArrayFilter)を参照してください。getFilter().filter(s)はあなたのケースでは何もしません。

+0

ああありがとう! :)フィルタリングは正常に動作しますが、ListActivityからすべての要素を削除するためにadapter.clear()を呼び出すと、常にUnsupportedOperationExceptionが発生します。 – martin

0

ArrayAdapterクラスのsource code of ArrayFilterを読んで、Androidの開発者がこの問題に取り組む方法から学びます。

クラスArrayFilterは、カスタムFilterクラスであり、そのインスタンスはgetFilterメソッドによって使用され、返されます。私はあなたがそれを通過する場合、あなたのすべての答えを持っていると確信しています。

関連する問題