2013-10-17 180 views
0

在我的应用程序中,我有一个用户已安装应用程序的列表,并且希望为该列表创建一个搜索功能。现在,这里是我的编码:如何为搜索功能制定自定义过滤器

 // create new adapter 
AppInfoAdapter adapter = new AppInfoAdapter(this, Utilities.getInstalledApplication(this), getPackageManager()); 
// load list application 
mListAppInfo = (ListView)findViewById(R.id.lvApps); 
// set adapter to list view 
mListAppInfo.setAdapter(adapter); 
// search bar 
inputSearch = (EditText) findViewById(R.id.inputSearch); 

inputSearch.addTextChangedListener(new TextWatcher() { 

    @Override 
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 

     // When user changed the Text 
     // Drag_and_Drop_App.this.adapter.getFilter().filter(cs); 
     Drag_and_Drop_App.this.adapter.getFilter().filter(cs); 

    } 

    @Override 
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
      int arg3) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void afterTextChanged(Editable arg0) { 
     // TODO Auto-generated method stub       
    } 
    }); 

,当我在这条线得到一个错误出现该问题:

Drag_and_Drop_App.this.adapter.getFilter().filter(cs); 

它说,“用getFilter()”不是我的底座适配器定义,这是这样的:

package com.example.awesomefilebuilderwidget; 

IMPORTS 

public class AppInfoAdapter extends BaseAdapter { 
private Context mContext; 
private List mListAppInfo; 
private PackageManager mPackManager; 

public AppInfoAdapter(Context c, List list, PackageManager pm) { 
mContext = c; 
mListAppInfo = list; 
mPackManager = pm; 
} 

@Override 
public int getCount() { 
return mListAppInfo.size(); 
} 

@Override 
public Object getItem(int position) { 
return mListAppInfo.get(position); 
} 

@Override 
public long getItemId(int position) { 
return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
// get the selected entry 
ApplicationInfo entry = (ApplicationInfo) mListAppInfo.get(position); 

// reference to convertView 
View v = convertView; 

// inflate new layout if null 
if(v == null) { 
    LayoutInflater inflater = LayoutInflater.from(mContext); 
    v = inflater.inflate(R.layout.layout_appinfo, null); 
} 

// load controls from layout resources 
ImageView ivAppIcon = (ImageView)v.findViewById(R.id.ivIcon); 
TextView tvAppName = (TextView)v.findViewById(R.id.tvName); 
TextView tvPkgName = (TextView)v.findViewById(R.id.tvPack); 

// set data to display 
ivAppIcon.setImageDrawable(entry.loadIcon(mPackManager)); 
tvAppName.setText(entry.loadLabel(mPackManager)); 
tvPkgName.setText(entry.packageName); 

// return view 
return v; 
} 

@Override 
public Filter getFilter() { 
// TODO Auto-generated method stub 
return filter; 
} 
} 

我添加了最后一部分“公共过滤器...”从四处张望在stackoverflow上。但现在,我需要一个自定义筛选器进行搜索。我可以使用什么? (我已经尝试的一件事,但它不工作)

+1

如果您显示的是项目列表,那么扩展'ArrayAdapter'而不是'BaseAdapter'可能会有意义。 'ArrayAdapter'已经实现了'Filterable'接口,所以通过迁移你可以免费获得一个基本的过滤器。另外,特别是如果你需要更多的控制实际的过滤逻辑,你可以实现你自己的'过滤器'。关于如何做到这一点,有不少例子 - [这是一个](http://stackoverflow.com/a/14369336/1029225)。 –

回答

0

getFilter()没有定义的,因为你的适配器必须实现过滤的接口,所以只需添加的方法您的适配器“实现的可筛选”:

public class AppInfoAdapter extends BaseAdapter implements Filterable { 
    // your stuff 
} 

,并在您用getFilter

@Override 
public Filter getFilter() { 
    if(filter == null) { 
     filter = new Filter() { 
      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults results = new FilterResults(); 
       List<ApplicationInfo> myFilteredAppList = new ArrayList<ApplicationInfo>(); 
       constraint = constraint.toString().toLowerCase(); 

       for (ApplicationInfo appInfo : originalListAppInfo) { 
        String somefield = appInfo.getSomeField(); 
        if (somefield.toLowerCase().contains(constraint.toString())) { 
         myFilteredAppList.add(appInfo); 
        } 
       } 
       results.count = myFilteredAppList.size(); 
       results.values = myFilteredAppList; 
       return results; 
      } 

      @Override 
      protected void publishResults(CharSequence constraint, FilterResults results) { 
       mListAppInfo = (List<ApplicationInfo>)results.values; 
       notifyDataSetChanged(); 
      } 
     }; 
    } 
    return filter; 
} 

通知,我已经反复throuh原始列表(originalListAppInfo)的副本,创建适配器期间创建的。

private List<ApplicationInfo> originalListAppInfo; 
private List<ApplicationInfo> mListAppInfo; 

private Filter filter; 

public AppInfoAdapter(Context context, List<ApplicationInfo> listApp) { 
    this.context = context; 
    this.originalListAppInfo = this.mListAppInfo = listApp; 
} 

希望得到这个帮助。 :)

+0

除了这一行上的两个错误之外,其工作方式如下: String somefield = appInfo.getSomeField(); 和这一行: myFilteredAppList.add(site); 说“getSomeField();”是不确定的,而且“网站”不能被解析为一个变量 – user1628978

+0

唯一的快速修复“getSomeField”是铸造类型添加到了AppInfo – user1628978

+0

,然后“地盘”这当然是说创造的东西,但它也说,我可以将其更改为appInfo。我应该这样做吗? – user1628978

相关问题