gpt4 book ai didi

android - 在不覆盖 getFilter 方法的情况下使用 ArrayAdapter 过滤 ListView

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:37 25 4
gpt4 key购买 nike

在此 Stackoverflow 中 answer , 这表明过滤可以在 ListView 中完成,而无需覆盖 ArrayAdaptergetFilter 方法,而是实现 toString POJO 类中的。

我已尝试实现它,但过滤功能无法正常工作。尽管 ListView 确实进行了过滤,但它并未显示数组中的正确项。因此,例如,如果过滤器匹配 array 中的一行,则 ListView 中会显示一个项目,但显示的是错误的项目。在这种情况下,始终显示数组的第一项,而不是实际匹配输入的搜索文本的项。

这是我的ArrayAdapter 的代码:

public class TitleListingArrayAdapter extends ArrayAdapter<Title> {

private List<Title> items;
private Context context;

public TitleListingArrayAdapter(Context context, int textViewResourceId, List<Title> items) {
super(context, textViewResourceId, items);
this.items = items;
this.context = context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View view = convertView;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.titlelisting_single_row, null);
}
Title item = items.get(position);
if (item!= null) {
TextView titleView = (TextView) view.findViewById(R.id.title);
if (titleView != null) {
titleView.setText(item.getName());
}
TextView yearView = (TextView) view.findViewById(R.id.year);
if (yearView != null) {
yearView.setText(String.valueOf(item.getYear())+", ");
}
TextView genreView = (TextView) view.findViewById(R.id.genre);
if (genreView != null) {
genreView.setText(item.getGenre());
}
TextView authorView = (TextView) view.findViewById(R.id.author);
if (authorView != null) {
authorView.setText(item.getAuthor());
}
RatingBar ratingView = (RatingBar) view.findViewById(R.id.rating);
if (ratingView != null) {
ratingView.setRating(item.getRating());
}
ImageView iconView = (ImageView) view.findViewById(R.id.list_image);
iconView.setImageResource(lookupResourceId(context, item.getID()));
}
return view;
}

private int lookupResourceId(Context context, String id) {
String resourceName = "thumb_"+id;
return context.getResources().getIdentifier(resourceName, "drawable", context.getPackageName());
}
}

这是我的 Activity 代码的相关部分:

 @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listing);
databaseHandler = new DatabaseHandler(this);
listView = (ListView) findViewById(R.id.list);
List<Title> titles = databaseHandler.getAllTitles();
adapter = new TitleListingArrayAdapter(this, R.id.list, titles);
listView.setAdapter(adapter);
filterText = (EditText) findViewById(R.id.filter);
filterText.addTextChangedListener(filterTextWatcher);
}

private TextWatcher filterTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s.toString().toLowerCase());
}
};

Title POJO 类实现 toString 如下:

@Override
public String toString() {
String name = this.getName() == null ? "" : this.getName().toLowerCase();
String year = this.getYear() == null ? "" : this.getYear().toString();
String genre = this.getGenre() == null ? "" : this.getGenre().toLowerCase();
return name + " " +year+ " "+ genre;
}

有谁知道为什么过滤不能正常工作以及我该如何修复它?

最佳答案

以下question处理与我遇到的完全相同的问题。这个问题还给出了过滤正在做什么的示例,通过不显示列表中的正确项目来显示正确的数量项目。

看来这个answer是错误的,尽管被投票六次。我通过不使用 getFilter 解决了这个问题ArrayAdapter 的方法根本。相反,我创建了一个新的 ArrayAdapter在我的 TextWatcher实例如下:

private TextWatcher filterTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!s.toString().equals("")) {
List<Title> filteredTitles = new ArrayList<Title>();
for (int i=0; i<titles.size(); i++) {
if (titles.get(i).toString().contains(s)) {
filteredTitles.add(titles.get(i));
}
}
adapter = new TitleListingArrayAdapter(TitleListingActivity.this, R.id.list, filteredTitles);
listView.setAdapter(adapter);
}
else {
adapter = new TitleListingArrayAdapter(TitleListingActivity.this, R.id.list, titles);
listView.setAdapter(adapter);
}
}
};

请注意,我还移动了声明 List<Title> titles来自 onCreate并使它成为我的成员变量 Activity类,以便可以在 onTextChanged 中访问它filterTextWatcher的方法| .

关于android - 在不覆盖 getFilter 方法的情况下使用 ArrayAdapter 过滤 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15042860/

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