Android 筛选的ListView未更新

Android 筛选的ListView未更新,android,listview,filter,android-arrayadapter,Android,Listview,Filter,Android Arrayadapter,我有一个带有扩展ArrayAdapter的自定义适配器的ListView。这是一个非常适合艺术家的类型 Artister是一个具有名称和id的非常小的类。必须重写Artister类toString()以仅返回名称 我有一个编辑文本。EditText有一个TextChangeListener,我在适配器上调用.getFilter().filter(chars,callback) 在Filter.Filterlistener().onComplete()回调中,我打印了计数,它看起来非常好。当我打字

我有一个带有扩展ArrayAdapter的自定义适配器的ListView。这是一个非常适合艺术家的类型

Artister是一个具有名称和id的非常小的类。必须重写Artister类toString()以仅返回名称

我有一个编辑文本。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.)在Activities onCreate()中设置我的列表视图:

private ListView ListView=null;
私有ArtistaAdapter ArtistaAdapter=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.search_);
artistAdapter=新的artistAdapter(this,R.layout.row,list);/“list”是一个ArrayList
listView=(listView)findViewById(R.id.list\u search);
setAdapter(artistAdapter);
setFastScrollEnabled(true);
setTextFilterEnabled(true);
setOnItemClickListener(新的OnItemClickListener(){
公共位置(适配器视图av、视图v、内部位置、长id){
//做点什么
}
});
EditText txtSearch=(EditText)findViewById(R.id.list\u search\u text);
addTextChangedListener(新的TextWatcher(){
public void posterextchanged(可编辑arg0){}
public void beforeTextChanged(字符序列arg0、int arg1、int arg2、int arg3){}
public void onTextChanged(字符序列字符、int start、int before、int count){
artistAdapter.getFilter().filter(chars,new filter.FilterListener(){
已完成的公共无效过滤器(整数计数){
Log.d(Config.Log_标记,“过滤器完成!计数:”+count);
artistAdapter.notifyDataSetChanged();
}
});
}
});
}
简言之,这是我的艺术天赋。我添加了一个remove()和add()方法:

公共类ArtistAdapter扩展了ArrayAdapter实现了SectionIndexer{
私人清单项目;
/*其他内容,如覆盖的getView、getPositionForSection、getSectionForPosition等*/
@凌驾
删除公共空白(艺术家对象){
超级。移除(对象);
项目。移除(对象);
}
@凌驾
公共空白添加(艺术家对象){
super.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;
    }
}
公共类艺术家实现可比较{
公共字符串uid;
公共字符串名称;
公共艺术家(字符串id、字符串名称){
this.uid=id;
this.name=名称;
}
公共int比较(另一位艺术家){
返回此.name.compareToIgnoreCase(另一个.name);
}
@凌驾
公共字符串toString(){
返回此.name;
}
}

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

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

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

在我重写的getView()中,当我想要获取当前项时,我执行了以下操作: items.getItem(位置) 现在我做一个: getItems(position)(因此该项是从基类的存储中检索的,而不是从我自己的存储中检索的),这似乎就做到了

这是我的getView()现在的样子(正在运行的版本):


Pfu,这是一个非常恼人的错误…

您必须重写
toString()
方法,以返回要筛选的文本。

我尝试使用.setFilterText(),但没有任何结果。我查看了.setFilterText():为了让它工作,适配器必须实现Filterable接口,这个接口只是定义了我上面使用的.getFilter()方法。因此,您的解决方案与我的相同(或者准确地说,它与我的不完全相同)还有其他想法吗?它在FilterListener中给出了正确的计数值吗?嗨,Karan!是的,在FilterListeners onFilterComplete()中,我有正确的计数值!你知道为什么列表视图没有更新吗?你好,安东,我有和你解决的相同的问题。我尝试删除局部变量列表。但没有从ListView中搜索或查找数据。我设置了getItem(位置)而不是items。get(位置)但问题没有解决。请建议如何解决这个问题的任何步骤problem@SBJ请您发布您的解决方案,以便帮助他人?
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);
    }
}    
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;
    }
}
@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;
}