0

ListActivity からカスタム ListView をフィルタリングしようとしています。問題は、フィルターが実際に機能している間、ListView が正しく表示されないことです。

たとえば、それぞれ a、b、c、da、db で始まる 3 つの項目がある場合、e と入力すると、ListView が空であることが示されます。ただし、b を入力すると a が表示され、c を入力すると a が表示されます。d と入力すると、a、b と表示されます。何が間違っていたのか、その問題が発生するために何が欠けているのか、完全にはわかりません。位置がフィルターに渡されていないようですが、これを行うにはどうすればよいですか?

以下は私のArrayAdapterです:

private class SiteAdapter extends ArrayAdapter<Site> {
    private ArrayList<Site> sites;

    public SiteAdapter(Context context, int textViewResourceId, ArrayList<Site> sites) {
        super(context, textViewResourceId, sites);
        this.sites = sites;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.row, null);
        }
        Site s = this.sites.get(position);
        if (s != null) {
            TextView tt = (TextView) v.findViewById(R.id.toptext);
            TextView bt = (TextView) v.findViewById(R.id.bottomtext);
            TextView rt = (TextView) v.findViewById(R.id.statustext);
            if (tt != null) {
                tt.setText("sup2");
            }
            if (bt != null) {
                bt.setText("sup");
            }
            if (rt != null) {
                rt.setText("sup");
            }
        }
        v.setOnClickListener(new OnItemClickListener(position));
        return v;
    }

    private class OnItemClickListener implements OnClickListener{           
        private int mPosition;
        OnItemClickListener(int position){
                mPosition = position;
        }
        @Override
        public void onClick(View arg0) {
            //Log.v("MainActivity", sites.get(mPosition).getURL());
            Intent intent = new Intent(getBaseContext(), Wee.class);
            startActivityForResult(intent,1);
        }               
    }
}


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

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

私のオブジェクトクラスには次のものがあります:

@Override
public String toString() {
    return new StringBuilder()
    .append(this.SEARCHABLE).toString();
}

正しくフィルタリングするようになりましたが、テキスト ボックスを削除または空にするときに、フィルターがリストビューを元の状態に戻していません。ListView のカスタム フィルタリング ArrayAdapterから例を取得しました。

private class SiteFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            String prefix = constraint.toString().toLowerCase();

            if (prefix == null || prefix.length() == 0) {
                ArrayList<Site> list = new ArrayList<Site>(sites);
                results.values = list;
                results.count = list.size();
            } else {
                final ArrayList<Site> list = new ArrayList<Site>(sites);
                final ArrayList<Site> nlist = new ArrayList<Site>();
                int count = list.size();

                for (int i = 0; i < count; i++) {
                    final Site pkmn = list.get(i);
                    final String value = pkmn.getFILTERABLETEXT().toLowerCase();

                    if (value.startsWith(prefix)) {
                        nlist.add(pkmn);
                    }
                }
                results.values = nlist;
                results.count = nlist.size();
            }
            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            filtered_sites = (ArrayList<Site>) results.values;

            clear();
            int count = filtered_sites.size();
            for (int i = 0; i < count; i++) {
                Site pkmn = (Site) filtered_sites.get(i);
                add(pkmn);
            }
        }
    }

チャンドラのアドバイス:

@SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            filtered_sites = (ArrayList<Site>) results.values;
            site_adapter.notifyDataSetChanged();
            clear();
            int count = filtered_sites.size();
            for (int i = 0; i < count; i++) {
                Site pkmn = (Site) filtered_sites.get(i);
                add(pkmn);
                Log.d("OMGOMGOMG",pkmn.getURL());
            }
            site_adapter.notifyDataSetInvalidated();
        }
4

1 に答える 1

0

データの変更を通知していないと思います。追加notifyDataSetChanged方法onTextChanged

public void onTextChanged(CharSequence s, int start, int before, int count) {
    site_adapter.getFilter().filter(s);
    site_adapter.notifyDataSetChanged(); 
}
于 2012-06-28T01:14:30.970 に答える