Arrayadapter をフィルタリングしています。カスタム アレイ アダプターを使用します。今、私はフィルタリングしたいのですが、これにはカスタムフィルターが必要です。多くの例の1つに従いましたが、まだ問題があります。私のコードが以下のようなものである場合はいつでも、フィルタリング中に何も起こりません。それは getView と最後の行が原因だと思います:
textView.setText(original.get(position))
これは次のようにすべきだと思いました:
textView.setText(fItems.get(position))
しかし、これに変更すると、次のエラーが発生します。
03-14 21:27:19.541: E/AndroidRuntime(25128): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
この行で。そのため、クラッシュするか、機能しません。誰が私が間違っているのか知っていますか?
これが私のコードです:
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.TextView;
public class SimpleListAdapter extends ArrayAdapter<String>{
private final Context context;
private Filter filter;
private List<String> fItems;
private final List<String> original;
public SimpleListAdapter(Context context, String[] values) {
super(context, R.layout.view_listitem, values);
this.context = context;
original = new ArrayList<String>();
for(int i=0;i<values.length;i++) {
original.add(values[i]);
}
fItems = new ArrayList<String>(original);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.view_listitem, parent, false);
TextView textView = (TextView) rowView.findViewById(R.id.tv_listitem);
textView.setText(original.get(position)); //fItems.get(position?/!)
return rowView;
}
@Override
public String getItem(int pos) {
return original.get(pos); //fItems.get(position?/!)
}
@Override
public Filter getFilter()
{
if (filter == null)
filter = new StringNameFilter();
return filter;
}
private class StringNameFilter extends Filter
{
@Override
protected FilterResults performFiltering(CharSequence constraint)
{
FilterResults results = new FilterResults();
String prefix = constraint.toString().toLowerCase();
if (prefix == null || prefix.length() == 0)
{
ArrayList<String> list = new ArrayList<String>(original);
results.values = list;
results.count = list.size();
}
else
{
final ArrayList<String> list = new ArrayList<String>(original);
final ArrayList<String> nlist = new ArrayList<String>();
int count = list.size();
for (int i=0; i<count; i++)
{
final String String = list.get(i);
final String value = String.toLowerCase();
if (value.startsWith(prefix))
{
nlist.add(String);
}
}
results.values = nlist;
results.count = nlist.size();
}
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
fItems = (ArrayList<String>)results.values;
fItems.clear();
int count = fItems.size();
for (int i=0; i<count; i++)
{
String String = (String)fItems.get(i);
fItems.add(String);
}
}
}
}