M J*_*sse 5 android android-arrayadapter
所以我有一个自定义,ArrayAdapter所以我可以使用可用的标题/副标题视图ListView.我有一个EditText接受字符串并过滤适配器.
过滤器工作的意义在于它正在过滤正确的对象(我可以通过点击它来判断它并使用正确的"额外"来启动意图.)
但是,即使过滤工作,适配器中的项目也不会更新以显示正确的信息...标题和副标题不正确.
让我们说我们有0到9的项目ListView,我过滤到3项搜索,并说让过滤的项目显示5,6,9 ... 3项,但它的前3项目的原- 搜索ListView(0-2).如果我单击项目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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是搜索
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
}
};
Run Code Online (Sandbox Code Playgroud)
M J*_*sse 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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
事实证明,当您搜索时,Filter的自定义实现更新了显示.希望这会对一些人有所帮助.
| 归档时间: |
|
| 查看次数: |
5686 次 |
| 最近记录: |