سؤال

لدي ListView مع محول مخصص يمتد ArrayAdapter. إنه ArrayAdapter من نوع الفنان.

الفنان هو فئة صغيرة جدا لها اسم ومعرف. لقد تجاوزت فئة الفنان ToString () لإعادة الاسم فقط.

لدي edittext. يحتوي EditText على TextChangelistener حيث أتصل .getFilter (). Filter (chars ، رد الاتصال) على محول بلدي.

في Filter.FilterListener (). OnComplete () رد الاتصال أنا طباعة العدد ويبدو جيدًا حقًا. كما أكتب انخفاض العد. لذلك فإنه يعمل كل شيء على ما هو معلن ، لكن القائمة تبقى كما هي. حاولت الاتصال بالفنان. [انظر 2.)

أنا أتجول لعدة أيام الآن! أنا يائس .. آمل أن يتمكن شخص ما من إلقاء نظرة على الكود الخاص بي ويخبرني بما أفعله خطأ!

شكرًا!

هذا ما فعلته:

1.) حدد ListView و edittext مثل هذا:

<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_search_text"
    android:layout_width="fill_parent"
    android:layout_height="35dip"
    android:layout_below="@id/header">
</EditText>       
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_search"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
</ListView>

2.) إعداد ListView في أنشطة onCreate ():

private ListView listView = null;
private ArtistAdapter artistAdapter = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search_artists);

    artistAdapter = new ArtistAdapter(this, R.layout.row, list); // 'list' is an ArrayList<Artist>

    listView = (ListView) findViewById(R.id.list_search);
    listView.setAdapter(artistAdapter);
    listView.setFastScrollEnabled(true);
    listView.setTextFilterEnabled(true);

    listView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> av, View v, int position, long id) {
            // do something
        }
    });

    EditText txtSearch = (EditText) findViewById(R.id.list_search_text);
    txtSearch.addTextChangedListener(new TextWatcher() {
        public void afterTextChanged(Editable arg0) { }

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

        public void onTextChanged(CharSequence chars, int start, int before, int count) {
            artistAdapter.getFilter().filter(chars, new Filter.FilterListener() {
                public void onFilterComplete(int count) {
                    Log.d(Config.LOG_TAG, "filter complete! count: " + count);
                    artistAdapter.notifyDataSetChanged();
                }
            });
        }
    });
}

3.) هذا هو بلدي الفنان باختصار. أضفت طريقة إزالة () وإضافة ():

public class ArtistAdapter extends ArrayAdapter<Artist> implements SectionIndexer {
    private List<Artist> items;

    /* other stuff like overridden getView, getPositionForSection, getSectionForPosition and so on */

    @Override
    public void remove(Artist object) {
        super.remove(object);
        items.remove(object);
    }

    @Override
    public void add(Artist object) {
        super.add(object);
        items.add(object);
    }
}    

4.) فنان بلدي لديه أيضا tostring () تجاوز:

public class Artist implements Comparable<Artist> {
    public String   uid;
    public String   name;

    public Artist(String id, String name) {
        this.uid = id;
        this.name = name;
    }

    public int compareTo(Artist another) {
        return this.name.compareToIgnoreCase(another.name);
    }

    @Override
    public String toString() {
        return this.name;
    }
}
هل كانت مفيدة؟

المحلول

لقد وجدت الحل. لقد أعادت كتابة الكود بأكمله من الصفر ووجدت المشكلة.

في جهاز ArrayAdapter المخصص الخاص بي يسمى ArtistAdapter (انظر 3. في السؤال) إذا كان لديك VAR لتخزين العناصر: عناصر القائمة الخاصة ؛

وفي GetView () في GetView () عندما أرغب في الحصول على العنصر الحالي الذي قمت به: items.getItem (الموضع) الآن ، أفعل A: getItems (الموضع) (بحيث يتم استرداد العنصر من تخزين الفئة الأساسية وليس بلدي ) ويبدو أن هذا يفعل الحيلة!

هذا هو getView () كما هو الآن (الإصدار ، الذي يعمل):

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LinearLayout artistView;
    Artist art = getItem(position);

    if (convertView == null) {
        artistView = new LinearLayout(getContext());
        String inflater = Context.LAYOUT_INFLATER_SERVICE;
        LayoutInflater vi;
        vi = (LayoutInflater)getContext().getSystemService(inflater);
        vi.inflate(resId, artistView, true);
    } else {
        artistView = (LinearLayout) convertView;
    }
    TextView nameView = (TextView)artistView.findViewById(R.id.txt_name);
    TextView uidView = (TextView)artistView.findViewById(R.id.txt_uid);
    nameView.setText(art.name);
    uidView.setText(art.uid);
    return artistView;
}

PFU ، كان هذا خطأ مزعج حقًا ...

نصائح أخرى

حاول استخدام ListView.setFilterText () بدلاً من ذلك مرشح المحول.

عليك تجاوز toString() الطريقة ، لإرجاع النص الذي تريد تصفية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top