已过滤的ListView未更新

时间:2010-03-24 06:39:36

标签: android listview filter android-arrayadapter

我有一个带有自定义适配器的ListView,它扩展了ArrayAdapter。它是Type Artist的ArrayAdapter。

艺术家是一个非常小的类,有一个名字和一个id。 Artist类必须覆盖toString()才能返回名称。

我有一个EditText。 EditText有一个TextChangeListener,我在我的适配器上调用.getFilter()。filter(chars,callback)。

在Filter.Filterlistener()。onComplete()回调中,我打印计数,它看起来非常好。当我键入计数减少。所以它接缝一切按照广告宣传,但列表保持不变。我试图调用artistAdapter.notifyDataSetChanged()来强制列表重绘,但没有任何反应。 [见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.。)在活动onCreate()中设置我的ListView:

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。)这是我的ArtistAdapter。我添加了remove()和add()方法:

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;
    }
}

3 个答案:

答案 0 :(得分:4)

我找到了解决方案。我从头开始重写了整个代码,发现了问题。

在我的自定义ArrayAdapter中,名为ArtistAdapter(参见3.)如果有一个var来存储项目: 私人清单项目;

在我重写的getView()中,当我想要获取当前项目时: items.getItem(位置) 现在我做了一个: getItems(position)(所以该项是从基类的存储中检索而不是我自己的),这似乎可以解决问题!

这是我现在的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,这是一个非常烦人的错误......

答案 1 :(得分:1)

尝试使用listView.setFilterText()而不是适配器过滤器。

答案 2 :(得分:1)

您必须覆盖toString()方法,才能返回要过滤的文字。