所以我有一个自定义ArrayAdapter
,所以我可以使用ListView
上提供的标题/副标题视图。我有EditText
接受字符串并过滤适配器。
过滤器工作的意义在于它正在过滤正确的对象(我可以通过点击它来判断它并使用正确的“额外”来启动意图。)
但即使过滤有效,适配器中的项目也不会更新以显示正确的信息......标题和副标题不正确。
假设我们在ListView
上有0到9的项目,我通过搜索过滤到3个项目,并且可以说过滤的项目是显示5,6,9 ... 3个项目,但是原始预搜索ListView
(0-2)的前3项。如果我单击项目2(第三项),则9的内容包含在新意图中。这对于搜索条件是正确的,但标题确实反映了正确的信息。
我不确定我需要告诉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
}
};
答案 0 :(得分:13)
根据我的确定,似乎我需要为自定义ArrayAdapter定制Filter。 自定义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();
}
}
}
}
事实证明,当您搜索时,Filter的自定义实现更新了显示。希望这会对一些人有所帮助。