1

截至目前我有三個標籤(滾動),它們與ActionBarActivity片段實現ActionBar.TabListener定影用getFilter用於搜索查看

enter image description here

我試圖當我添加了搜索查看功能按搜索圖標,以便彈出edittext過濾哪些應用程序我想搜索。

我的目標這樣的事情: enter image description here

目前我想實現我從這裏學到的東西:

List Filter Custom Adapter dont give result

Android - Actionbar Sherlock - Search Filter

Android ActionBar Customize Search View

所以現在我有這個我n我的ActionBarActivity:

@Override 
    public boolean onCreateOptionsMenu(Menu menu){ 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.block, menu); 

     final EditText editText = (EditText) menu.findItem(
       R.id.action_search).getActionView(); 
     editText.addTextChangedListener(textWatcher); 

     MenuItem menuItem = menu.findItem(R.id.action_search); 
     menuItem.setOnActionExpandListener(new OnActionExpandListener() { 
      @Override 
      public boolean onMenuItemActionCollapse(MenuItem item) { 
       // Do something when collapsed 
       return true; // Return true to collapse action view 
      } 

      @Override 
      public boolean onMenuItemActionExpand(MenuItem item) { 
       editText.clearFocus(); 
       return true; // Return true to expand action view 
      } 
     }); 

     return super.onCreateOptionsMenu(menu); 
    } 
    private TextWatcher textWatcher = new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
            int count) { 

      if (null != mAdapter) { 
       mAdapter.getFilter().filter(s); 
      } 
     } 

問題是getFilter方法無法解析。在這種情況下我不確定。

我的適配器類是:

package com.ibc.android.demo.appslist.app; 

import android.app.Activity; 
import android.content.pm.PackageInfo; 
import android.content.pm.PackageManager; 
import android.graphics.drawable.Drawable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.CheckBox; 
import android.widget.TextView; 
import android.view.View.OnClickListener; 

import com.spicycurryman.getdisciplined10.app.R; 

import java.util.List; 

public class ApkAdapter extends BaseAdapter { 


    List<PackageInfo> packageList; 
    Activity context; 
    PackageManager packageManager; 
    boolean[] itemChecked; 

    public ApkAdapter(Activity context, List<PackageInfo> packageList, 
         PackageManager packageManager) { 
     super(); 
     this.context = context; 
     this.packageList = packageList; 
     this.packageManager = packageManager; 
     itemChecked = new boolean[packageList.size()]; 
    } 

    private class ViewHolder { 
     TextView apkName; 
     CheckBox ck1; 
    } 

    public int getCount() { 
     return packageList.size(); 
    } 

    public Object getItem(int position) { 
     return packageList.get(position); 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 

     LayoutInflater inflater = context.getLayoutInflater(); 

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.installed_apps, null); 
      holder = new ViewHolder(); 

      holder.apkName = (TextView) convertView 
        .findViewById(R.id.appname); 
      holder.ck1 = (CheckBox) convertView 
        .findViewById(R.id.checkBox1); 

      convertView.setTag(holder); 
      //holder.ck1.setTag(packageList.get(position)); 

     } else { 

      holder = (ViewHolder) convertView.getTag(); 
     } 
     // ViewHolder holder = (ViewHolder) convertView.getTag(); 
     PackageInfo packageInfo = (PackageInfo) getItem(position); 

     Drawable appIcon = packageManager 
       .getApplicationIcon(packageInfo.applicationInfo); 
     String appName = packageManager.getApplicationLabel(
       packageInfo.applicationInfo).toString(); 
     appIcon.setBounds(0, 0, 75, 75); 
     holder.apkName.setCompoundDrawables(appIcon, null, null, null); 
     holder.apkName.setCompoundDrawablePadding(15); 
     holder.apkName.setText(appName); 
     holder.ck1.setChecked(false); 

     if (itemChecked[position]) 
      holder.ck1.setChecked(true); 
     else 
      holder.ck1.setChecked(false); 

     holder.ck1.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       if (holder.ck1.isChecked()) 
        itemChecked[position] = true; 
       else 
        itemChecked[position] = false; 
      } 
     }); 

     return convertView; 

    } 



} 

什麼,我需要在我的適配器類來解決用getFilter方法錯誤,以及爲什麼改變?我也想知道是否有一個更優化/有效的方式來實現搜索行動欄...?

+0

ApkAdapter添加此已實現的可篩選IFACE – pskink

回答

1

ApkAdapter必須實現Filterable接口。然後,您需要實際編寫自己的篩選邏輯來執行篩選。請記住,所有過濾邏輯都發生在後臺線程上。這意味着所有的適配器mutate方法都需要同步鎖定......除非您完全確定地知道,否則一旦加載後,適配器將永遠不會改變。

請注意,ApkAdapter的實現不會做ArrayAdapter無法做的任何事情。因此擴展ArrayAdapter類可能會更好,因爲它已經支持過濾。但是,我應該指出,ArrayAdapter中有filtering bugs

另外,如果你想避免編寫你自己的過濾代碼的麻煩,我建議檢查這alternative

3

第一工具可篩選在ApkAdapter類

在apkAdapter CLAS添加此

@Override 
    public Filter getFilter() { 
     if (mFilter == null) { 
      mFilter = new ItemsFilter(); 
     } 
     return mFilter; 
    } 

    private class ItemsFilter extends Filter { 

     @Override 
     protected FilterResults performFiltering(CharSequence prefix) { 
      // TODO Auto-generated method stub 

      ArrayList<PackageInfo> packageList_2 = packageList; 
      String prefixString = prefix.toString().toLowerCase(); 
      FilterResults results = new FilterResults(); 
      ArrayList<PackageInfo> FilteredList = new ArrayList<PackageInfo>(); 

      if (prefix == null || prefix.length() == 0) { 
       results.values = packageList_2; 
       results.count = packageList_2.size(); 
       return results; 
      } 
      for (int i = 0; i < packageList_2.size(); i++) { 
       String filterText = prefix.toString().toLowerCase(); 
       try { 
        PackageInfo data = packageList_2.get(i); 
        if (data.applicationInfo 
          .loadLabel(getActivity().getPackageManager()) 
          .toString().toLowerCase().contains(filterText)) { 
         FilteredList.add(data); 
        } else if (data.packageName.contains(filterText)) { 
         FilteredList.add(data); 
        } 
       } catch (Exception e) { 
        Toast.makeText(getActivity(), 
          "exception e" + e.toString(), 
          Toast.LENGTH_SHORT).show(); 
       } 
      } 
      results.values = FilteredList; 
      results.count = FilteredList.size(); 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, 
       FilterResults results) { 
      Toast.makeText(getActivity(),"result-0 "+results.count, 
        Toast.LENGTH_SHORT).show(); 
      packageList = (List<PackageInfo>) results.values; 
      notifyDataSetChanged(); 

     } 
    } 

然後在OnCreateOptionMenu

@Override 
     public boolean onCreateOptionsMenu(Menu menu){ 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.block, menu); 

     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); 
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 
      if (!isLoading()) { 
       mAppAdapter.getFilter().filter(query); 
      } 
      return true; 
     } 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      if (!isLoading()) { 
       if (newText.equals("")) { 
        mAppAdapter.getFilter().filter(""); 
       } 
      } 
      return true; 
     } 
    }); 
+0

感謝。我會試試這個。你是怎麼偶然發現的? –

+0

dam有很多我無法解決的過濾器 –

+0

在mAppAdapter.getFilter()獲得空指針異常。 –