gpt4 book ai didi

Android自定义ArrayAdapter在过滤后不刷新

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:00:51 26 4
gpt4 key购买 nike

所以我有一个自定义的 ArrayAdapter,所以我可以使用 ListView 上可用的标题/副标题 View 。我有一个接受字符串并过滤适配器的 EditText

过滤器的工作原理是它过滤了正确的对象(我可以通过点击它来判断,它以正确的“额外”开始 Intent 。)

然而,即使过滤有效,适配器中的项目也不会更新以显示正确的信息...标题和副标题不正确。

假设我们在 ListView 上有项目 0 到 9,我通过搜索过滤到 3 个项目,假设过滤的项目是 5、6、9...显示 3 个项目,但它是原始预搜索 ListView (0-2) 的前 3 项。如果我点击第 2 项(第三项),9 的内容包含在新的 Intent 中。这对于搜索条件是正确的,但是标题确实反射(reflect)了正确的信息。

我不确定我需要告诉 ListView 刷新什么。我不认为它是 notifyDataSetChanged();

感谢任何帮助。谢谢!

    public class myListAdapter extends ArrayAdapter<Pizza>{
private ArrayList<Pizza> items;
private PizzaViewHolder myListHolder;

private class PizzaViewHolder{
TextView title;
TextView subtitle;
}

public myListAdapter(Context context, int textViewResourceId, ArrayList<Pizza> items) {
super(context, textViewResourceId, items);
this.items = items;
// TODO Auto-generated constructor stub
}

@Override
public View getView(int pos, View convertView, ViewGroup parent){
View v = convertView;
if(v == null){
LayoutInflater vi = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.myList_item, null);
myListHolder = new PizzaViewHolder();
myListHolder.title = (TextView)v.findViewById(R.id.title);
myListHolder.subtitle = (TextView)v.findViewById(R.id.subtitle);
v.setTag(myListHolder);
}else myListHolder = (PizzaViewHolder)v.getTag();

Pizza myList = items.get(pos);

if (myList != null){
myListHolder.title.setText(myList.getTitle());
myListHolder.subtitle.setText(myList.getSubTitle());
}
return v;
}
}

这是搜索

    private TextWatcher filterTextWatcher = new TextWatcher(){

public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
if(!s.equals("")){
((Filterable) this.listView1.getAdapter()).getFilter().filter(s);
}
}

public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub

}

public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub

}

};

最佳答案

根据我的判断,我的自定义 ArrayAdapter 似乎需要一个自定义过滤器。自定义 ArrayAdapter 具有 Filter 的重写实现,代码如下:

import java.util.ArrayList;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.TextView;

public class PizzaAdapter extends ArrayAdapter<Pizza>{

private ArrayList<Pizza> original;
private ArrayList<Pizza> fitems;
private Filter filter;


public PizzaAdapter(Context context, int textViewResourceId, ArrayList<Pizza> items) {
super(context, textViewResourceId, items);

this.original = new ArrayList<Pizza>(items);
this.fitems = new ArrayList<Pizza>(items);
this.filter = new PizzaFilter();
}

@Override
public View getView(int position, View convertView, ViewGroup parent){
View v = convertView;

if(v == null){
LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.pizza_list_item, null);
}

Pizza pizza = fitems.get(position);

if(pizza != null){
String subtitleString = new String("[" + pizza.getPizzaType() + "] " + pizza.getPizzaCategory() + ": " + pizza.getPizzaCode());

TextView title = (TextView)v.findViewById(R.id.title);
TextView subtitle = (TextView)v.findViewById(R.id.subtitle);

if(title != null){
title.setText(pizza.getPizzaName());
}
if(subtitle != null){
subtitle.setText(subtitleString);
}
}
return v;
}

@Override
public Filter getFilter(){

if(filter == null){
filter = new PizzaFilter();
}
return filter;
}

private class PizzaFilter extends Filter{
@Override
protected FilterResults performFiltering(CharSequence constraint){
FilterResults results = new FilterResults();
String prefix = constraint.toString().toLowerCase();

if (prefix == null || prefix.length() == 0){
ArrayList<Pizza> list = new ArrayList<Pizza>(original);
results.values = list;
results.count = list.size();
}else{
final ArrayList<Pizza> list = new ArrayList<Pizza>(original);
final ArrayList<Pizza> nlist = new ArrayList<Pizza>();
int count = list.size();

for (int i = 0; i<count; i++){
final Pizza pizza = list.get(i);
final String value = Pizza.getPizzaName().toLowerCase();

if(value.contains(prefix)){
nlist.add(pizza);
}
results.values = nlist;
results.count = nlist.size();
}
}
return results;
}

@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
fitems = (ArrayList<Pizza>)results.values;
notifyDataSetChanged();
clear();
int count = fitems.size();
for(int i = 0; i<count; i++){
add(fitems.get(i));
notifyDataSetInvalidated();
}
}
}
}

事实证明,过滤器的自定义实现会在您搜索时更新显示。希望这会帮助一些人。

关于Android自定义ArrayAdapter在过滤后不刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11840344/

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