Фильтрация с использованием TextWatcher в ListView, поддерживаемом String ArrayAdapter, возвращает пустые результаты - PullRequest
3 голосов
/ 09 августа 2011

Следующий код возвращает 0 просмотров в виде списка при вводе любого символа в поиске EditText.Следующий метод из класса activty

private void setupList() {
    final ListView lv = (ListView) findViewById(R.id.contactList);
    ArrayAdapter<Info> la = new MyListAdapter(this, mInfoList);
    lv.setAdapter(la);
    lv.setTextFilterEnabled(true);
    EditText edit =  (EditText) findViewById(R.id.searchbar);
    edit.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {

        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {

        }

        @Override
        public void afterTextChanged(Editable text) {
            Log.d("search", ""+text);
            ArrayAdapter<Info> la = (ArrayAdapter<Info>) lv.getAdapter();
            la.getFilter().filter(text);
            la.notifyDataSetChanged();
        }
    });
}

Это мой класс адаптера

public class MyListAdapter extends ArrayAdapter<Info> {
private Bitmap mDefaultProfilePic = null;
Context mContext = null;

public MyListAdapter(Context ctxt, ArrayList<Info> mFriendsAccounts) {
    super(ctxt, R.id.name, mFriendsAccounts);
    mContext = ctxt;

    mDefaultProfilePic = BitmapFactory.decodeResource(ctxt.getResources(), R.drawable.face);
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
        LayoutInflater inf = (LayoutInflater) mContext.getSystemService(Service.LAYOUT_INFLATER_SERVICE);
        convertView = inf.inflate(R.layout.layout_list_view, null);
    }
    Info usr = getItem(position);
    ((TextView)convertView.findViewById(R.id.name)).setText(usr.Name);
    ((ImageView)convertView.findViewById(R.id.invite)).setTag(position);

    if (mImageBitmaps.get(position) != null) {
        ((ImageView)convertView.findViewById(R.id.profilePic)).setImageBitmap(mImageBitmaps.get(position));
    } else {
        ((ImageView)convertView.findViewById(R.id.profilePic)).setImageBitmap(mDefaultProfilePic);
    }

    return convertView;
}

}

Ответы [ 2 ]

4 голосов
/ 10 августа 2011

Наконец-то исправили проблему.Мне пришлось переопределить метод toString() в Info объекте.В моем случае фильтрация основана на поле name, поэтому вернуло его через toString().
Процесс фильтрации вызывает toString() для каждого объекта в адаптере.

1 голос
/ 09 августа 2011

Здесь здесь написано:

Возвращенный адаптер может быть не тем же адаптером, который передан в setAdapter (ListAdapter), но может быть WrapperListAdapter

Может ли это иметь какое-либо отношение к вашей проблеме?

...