2014-01-10 105 views
1

我一直在試圖過濾/搜索適配器適配器與mSearch EditText。我正在尋求幫助實施getFilter()等。SearchView過濾器列表視圖

此活動正在顯示內容列表。 mSearch放置在列表上方,我想過濾/更新列表爲某人類型。

讓我知道你是否需要特定的代碼或更多信息。先謝謝你!

public class MainActivity extends FragmentActivity { 

private SearchView mSearch; 
private List<Model> mMain = new ArrayList<Model>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

public class MainFragment extends Fragment implements SearchView.OnQueryTextListener { 

    private ListView mListView; 
    private Adapter mAdapter; 

    public boolean onQueryTextChange(String query) { 
    if (mAdapter != null) { 
    mAdapter.getFilter().filter(query.toString()); 
    } 
    return false; 
    } 

    public boolean onQueryTextSubmit(String query) { 
    onQueryTextChange(query); 
    return false; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.main_user_list_row, container, false); 

    mListView = (ListView) findViewById(R.id.listView); 
    mAdapter = new Adapter(); 
    mListView.setAdapter(mAdapter); 
    mListView.setAdapter.setTextFilterEnabled(true); 

    mSearch.setOnQueryTextListener((SearchView.OnQueryTextListener) mContext); 

    return rootView; 

    } 

    public class Adapter extends BaseAdapter implements Filterable { 

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

    @Override 
    public Object getItem(int position) { 
    return 1; 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    View view = View.inflate(mContext, R.layout.main_user_list_row, null); 

    if (mContext != null && mMain.get(position) != null) { 
     TextView mPosition = (TextView) view.findViewById(R.id.position); 
     mPosition.setText("..."); 
    } 

    return view; 
    } 

    @Override 
    public Filter getFilter() { 
    return new Filter() { 

    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     mMain = (List<Model>) results.values; 
     Adapter.this.notifyDataSetChanged(); 
    } 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
     List<Contest> filteredResults = getFilteredResults(constraint); 
     FilterResults results = new FilterResults(); 
     results.values = filteredResults; 
     return results; 
    } 

    }; 
    } 

    } 

} 

我在getFilteredResults收到此錯誤

Cannot resolve method 'getFilteredResults(java.lang.CharSequence)' 

我也是在mSearch.setOnQueryTextListener((SearchView.OnQueryTextListener)mContext)得到這個錯誤;

FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to start activity ComponentInfo{...MainActivity}: java.lang.ClassCastException: ...InDraftActivity cannot be cast to android.widget.SearchView$OnQueryTextListener 

java.lang.ClassCastException: ...MainActivity cannot be cast to android.widget.SearchView$OnQueryTextListener 

SOLUTION

我通過實施,而不是片段活性的OnQueryTextListener,固定的搜索查看錯誤。

performFiltering需要看起來像

List<Contest> filteredResults = new ArrayList<Contest>(); 
FilterResults results = new FilterResults(); 
results.values = filteredResults; 
results.count = filteredResults.size(); 

見標記答案。

+0

什麼是getFilteredResults,你有沒有定義它?因爲我之前已經實現了這種類型的代碼,並且在 – Ogen

+0

之前從未使用過該方法,所以我刪除了getFilteredResults,而現在mMain.size()在publishResults期間返回爲null。 – localhost

+0

那麼如果你刪除了那個方法,那麼現在分配給'filteredResults'的是什麼?不是null? – Ogen

回答

2

在返回FilterResults之前,必須指定其值AND計數。目前,你只是指定像這樣的價值...

results.values = filteredResults; 

在這條線,你在你的performFiltering(...)方法返回results之前,加入這一行...

results.count = filteredResults.size(); 

編輯:一個完全工作適配器從我已經完成的項目過濾器

class ContactsAdapter extends BaseAdapter implements Filterable { 

    private List<Contact> mData; 
    private List<Contact> database; 
    private LayoutInflater mInflater; 
    private Context context; 
    static boolean inMarkMode = false; 

    ContactsAdapter(List<Contact> mData, List<Contact> database, Context context) { 
     this.mData = mData; 
     this.context = context; 
     this.database = database; 
     mInflater = LayoutInflater.from(context); 
    } 

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

    /** 
    * Modifies the way a contact is shown in its adapter depending on 
    * displayChoice shared preference 
    * 
    * @param position 
    *   of the contact in its listview 
    * @return <code>String</code> to display 
    */ 
    @Override 
    public String getItem(int position) { 
     switch (context.getSharedPreferences("settings", 
       HomeScreenActivity.MODE_PRIVATE).getInt("displayChoice", -1)) { 
     case 1: 
      return mData.get(position).getLastName() + " " 
        + mData.get(position).getFirstName(); 
     case 2: 
      return mData.get(position).getFirstName() + " " 
        + mData.get(position).getMobileNumber(); 
     case 3: 
      return mData.get(position).getLastName() + " " 
        + mData.get(position).getMobileNumber(); 
     default: 
      return mData.get(position).getFirstName() + " " 
        + mData.get(position).getLastName(); 
     } 
    } 

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

    /** 
    * Modifies the view shown in HomeScreenActivity depending on whether the 
    * user has entered mark mode or not 
    * 
    * @return <code>View</code> to display 
    */ 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     CheckedTextView result = null; 
     TextView normalResult = null; 
     final String contactRow = getItem(position); 

     if (inMarkMode) {// if user is in markMode, use the mark layout 
      if (convertView == null) { 
       result = (CheckedTextView) mInflater.inflate(
         R.layout.home_screen_contacts_mark_view, parent, false); 
      } else { 
       result = (CheckedTextView) convertView; 
      } 
      result.setText(contactRow); 
      result.setBackgroundResource(R.drawable.list_selector); 
     } else { // if user NOT in markmode, use normal contacts view layout 
      if (convertView == null) { 
       normalResult = (TextView) mInflater.inflate(
         R.layout.home_screen_contacts_view, parent, false); 
      } else { 
       normalResult = (TextView) convertView; 
      } 
      normalResult.setText(contactRow); 
      normalResult.setBackgroundResource(R.drawable.list_selector); 
     } 

     if (inMarkMode) { 
      return result; 
     } else { 
      return normalResult; 
     } 
    } 

    int getItemIdAtPosition(int position) { 
     return mData.get(position).getID(); 
    } 

    @Override 
    public Filter getFilter() { 
     return new Filter() { 
      @Override 
      protected FilterResults performFiltering(CharSequence charSequence) { 
       FilterResults results = new FilterResults(); 
       // If there's nothing to filter on, return the original data for 
       // your list 
       if (charSequence == null || charSequence.length() == 0) { 
        results.values = database; 
        results.count = database.size(); 
       } else { 
        List<Contact> filterResultsData = new ArrayList<Contact>(); 

        // if search details is 0, search fullName, else, search 
        // all details 
        if (HomeScreenActivity.searchAllDetails == 0) { 
         for (Contact c : database) { 
          if (c.getFullName().toLowerCase(Locale.ENGLISH) 
            .contains(charSequence)) { 
           filterResultsData.add(c); 
          } 
         } 
        } else { 
         for (Contact c : database) { 
          if (c.getAllDetailsForSearch() 
            .toLowerCase(Locale.ENGLISH) 
            .contains(charSequence)) { 
           filterResultsData.add(c); 
          } 
         } 
        } 

        results.values = filterResultsData; 
        results.count = filterResultsData.size(); 
       } 

       return results; 
      } 

      @SuppressWarnings("unchecked") 
      @Override 
      protected void publishResults(CharSequence charSequence, 
        FilterResults filterResults) { 
       // set the data to the filter results and notifyDataSetChanged() 
       mData = (List<Contact>) filterResults.values; 
       notifyDataSetChanged(); 
      } 
     }; 
    } 
} 
+0

太好了。謝謝。 getFilteredResults仍然沒有解決。我想列表 filteredResults = getFilteredResults(constraint);足夠好。我該怎麼做才能解決這個錯誤? – localhost

+1

@localhost我不知道getFilteredResults是什麼。您應該刪除它並使'lists filteredResults'等於某個arrayList,然後按照您想要的方式過濾arraylist,然後分配results.value和results.count然後返回它。我製作了一個使用這種過濾器的聯繫人管理器應用程序,我會將其放入我的答案中,以便您查看它。希望它會有一些用處。 – Ogen

+0

我明白了。這非常有幫助。 – localhost