在过滤listview时清除数据后,我没有获得原始listview android?
我在适配器类中实现了一个过滤器方法,如下所示在过滤listview时清除数据后,我没有获得原始listview android?,android,listview,Android,Listview,我在适配器类中实现了一个过滤器方法,如下所示 public class EntryAdapter extends ArrayAdapter<Item> implements Filterable { private Context context; private ArrayList<Item> items; private ArrayList<Item> fitems; private LayoutInflater vi;
public class EntryAdapter extends ArrayAdapter<Item> implements Filterable {
private Context context;
private ArrayList<Item> items;
private ArrayList<Item> fitems;
private LayoutInflater vi;
private contact contact;
private ItemsFilter mFilter;
public EntryAdapter(Context context,ArrayList<Item> items) {
super(context,0, items);
this.context = context;
this.contact=(contact) context;
this.items = items;
vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return items.size();
}
@Override
public Item getItem(int position) {
// TODO Auto-generated method stub
return super.getItem(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
final Item i = items.get(position);
if (i != null) {
if(i.isSection()){
SectionItem si = (SectionItem)i;
v = vi.inflate(R.layout.list_item_section, null);
v.setOnClickListener(null);
v.setOnLongClickListener(null);
v.setLongClickable(false);
final TextView sectionView = (TextView) v.findViewById(R.id.list_item_section_text);
sectionView.setText(si.getTitle());
}else{
EntryItem ei = (EntryItem)i;
v = vi.inflate(R.layout.entrylist, null);
final TextView title = (TextView)v.findViewById(R.id.list_item_entry_title);
final TextView subtitle = (TextView)v.findViewById(R.id.list_item_entry_summary);
if (title != null)
title.setText(ei.title);
if(subtitle != null)
subtitle.setText(ei.subtitle);
}
}
return v;
}
public Filter getFilter() {
if (mFilter == null) {
mFilter = new ItemsFilter();
}
return mFilter;
}
private class ItemsFilter extends Filter{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint == null || constraint.length() == 0){
results.values = items;
results.count = items.size();
}
else{
ArrayList<Item> itemsList = new ArrayList<Item>();
for (Item i : items){
if (i.toString().toUpperCase().startsWith(constraint.toString().toUpperCase()))
itemsList.add(i);
}
results.values = itemsList;
results.count = itemsList.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
if (results.count == 0){
notifyDataSetInvalidated();
}
else{
ArrayList<Item> lst = (ArrayList<Item>)results.values;
ArrayList<Item> itemsList = new ArrayList<Item>(lst);
//this.items=mItems;
items =itemsList;
notifyDataSetChanged();
}
}
}
}
过滤工作正常,但当我按键盘上的交叉按钮时,我无法返回原始列表视图。我只得到我过滤过的数据。我希望如果用户再次将EditText设置为空,则应加载原始列表视图。您正在将过滤后的数据分配给原始列表,这就是您无法获取原始列表的原因。 您应该将筛选结果列表分配给fitems。 e、 g
fitems=(ArrayList)results.values;
notifyDataSetChanged();
好的,请尝试以下改进代码:--
公共类EntryAdapter扩展ArrayAdapter实现可过滤{
私人语境;
私有ArrayList项;
私人ArrayList fitems;
私人停车场6号;
私人接触;
私人物品过滤器;
公共入口适配器(上下文、ArrayList项){
超级(上下文,0,项);
this.context=上下文;
this.contact=(contact)上下文;
这个项目=项目;
this.fitems=新的ArrayList();
vi=(LayoutInflater)context.getSystemService(context.LAYOUT\u充气机\u服务);
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回items.size();
}
@凌驾
公共项getItem(int位置){
//TODO自动生成的方法存根
返回super.getItem(位置);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图v=转换视图;
最终项目i=fitems.get(位置);
如果(i!=null){
if(i.isSection()){
SectionItem si=(SectionItem)i;
v=vi.充气(R.布局.列表项目部分,空);
v、 setOnClickListener(空);
v、 setOnLongClickListener(空);
v、 设置长点击(假);
最终文本视图部分视图=(文本视图)v.findViewById(R.id.list\u item\u section\u text);
sectionView.setText(si.getTitle());
}否则{
EntryItem ei=(EntryItem)i;
v=vi.充气(R.布局.入口列表,空);
最终文本视图标题=(文本视图)v.findViewById(R.id.list\u item\u entry\u title);
最终文本视图字幕=(文本视图)v.findViewById(R.id.list\u item\u entry\u summary);
如果(标题!=null)
title.setText(ei.title);
如果(副标题!=null)
subtitle.setText(ei.subtitle);
}
}
返回v;
}
公共过滤器getFilter(){
if(mFilter==null){
mFilter=newitemsfilter();
}
返回过滤器;
}
私有类ItemsFilter扩展了筛选器{
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults results=新的FilterResults();
ArrayList FilteredArrList=新的ArrayList();
if(constraint==null | | constraint.length()==0){
结果值=项目;
results.count=items.size();
}
否则{
constraint=constraint.toString().toUpperCase();
ArrayList itemsList=新的ArrayList();
用于(项目i:项目){
if(i.toString().toUpperCase().startsWith(约束))
添加(i);
}
results.values=FilteredArrList;
results.count=filterDarrList.size();
}
返回结果;
}
@凌驾
受保护的无效发布结果(CharSequence约束,
FilterResults(结果){
fitems=(ArrayList)results.values;
notifyDataSetChanged();
}
}
}
请为您正在做的事情添加一些解释。现在请再试一次。我刚刚编辑了代码,它肯定会工作的。。实际上,在getView方法中,您只需要使用fItems(过滤列表)。。!
search.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//s= items.toString();
contact.this.adapter.getFilter().filter(s.toString());
adapter.notifyDataSetChanged();
}
fitems = (ArrayList<Item>) results.values;
notifyDataSetChanged();
public class EntryAdapter extends ArrayAdapter<Item> implements Filterable {
private Context context;
private ArrayList<Item> items;
private ArrayList<Item> fitems;
private LayoutInflater vi;
private contact contact;
private ItemsFilter mFilter;
public EntryAdapter(Context context,ArrayList<Item> items) {
super(context,0, items);
this.context = context;
this.contact=(contact) context;
this.items = items;
this.fitems = new ArrayList<Item>();
vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return items.size();
}
@Override
public Item getItem(int position) {
// TODO Auto-generated method stub
return super.getItem(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
final Item i = fitems.get(position);
if (i != null) {
if(i.isSection()){
SectionItem si = (SectionItem)i;
v = vi.inflate(R.layout.list_item_section, null);
v.setOnClickListener(null);
v.setOnLongClickListener(null);
v.setLongClickable(false);
final TextView sectionView = (TextView) v.findViewById(R.id.list_item_section_text);
sectionView.setText(si.getTitle());
}else{
EntryItem ei = (EntryItem)i;
v = vi.inflate(R.layout.entrylist, null);
final TextView title = (TextView)v.findViewById(R.id.list_item_entry_title);
final TextView subtitle = (TextView)v.findViewById(R.id.list_item_entry_summary);
if (title != null)
title.setText(ei.title);
if(subtitle != null)
subtitle.setText(ei.subtitle);
}
}
return v;
}
public Filter getFilter() {
if (mFilter == null) {
mFilter = new ItemsFilter();
}
return mFilter;
}
private class ItemsFilter extends Filter{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
ArrayList<Item> FilteredArrList = new ArrayList<Item>();
if (constraint == null || constraint.length() == 0){
results.values = items;
results.count = items.size();
}
else{
constraint = constraint.toString().toUpperCase();
ArrayList<Item> itemsList = new ArrayList<Item>();
for (Item i : items){
if (i.toString().toUpperCase().startsWith(constraint))
FilteredArrList.add(i);
}
results.values = FilteredArrList;
results.count = FilteredArrList.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
fitems = (ArrayList<Item>) results.values;
notifyDataSetChanged();
}
}
}