私は、アレイアダプタフィルタから標準フィルタを考えるの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
(配列)のみです。しかし、メソッドgetCount
getItem
などをオーバーライドするので、アダプタはコンストラクタで渡したリストを使用しません。しかし、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 codeのArrayAdapter
(およびArrayFilter
)を参照してください。getFilter().filter(s)
はあなたのケースでは何もしません。
ああありがとう! :)フィルタリングは正常に動作しますが、ListActivityからすべての要素を削除するためにadapter.clear()を呼び出すと、常にUnsupportedOperationExceptionが発生します。 – martin