gpt4 book ai didi

android - 过滤后的 ListView 未更新

转载 作者:太空狗 更新时间:2023-10-29 16:25:25 26 4
gpt4 key购买 nike

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

Artist 是一个非常小的类,它有一个名字和一个 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.) 在 Activity 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;
}
}

最佳答案

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

在我的名为 ArtistAdapter 的自定义 ArrayAdapter 中(请参阅有问题的 3)如果有一个 var 来存储项目:私有(private)列表项;

在我重写的 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;
}

噗,这真是个烦人的错误...

关于android - 过滤后的 ListView 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2505800/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com