2011-03-16 11 views
23

मैं एक सरल CursorAdapter- संचालित ListView को इसके ऊपर एक संपादन टेक्स्ट बॉक्स के साथ फ़िल्टर करना चाहता हूं। मेरे पास निम्न कोड है, लेकिन जब मैं बॉक्स में टाइप करता हूं, कुछ भी नहीं होता है; पूरी सूची प्रदर्शित करने के लिए जारी है। मैं क्या गलत कर रहा हूं?ListView, SimpleCursorAdapter, एक संपादन टेक्स्ट फ़िल्टर - यह कुछ भी क्यों नहीं करेगा?

mCursor = getDirectoryList(null); 

    adapter = new SimpleCursorAdapter(this, 
      R.layout.directory_people_item, mCursor, 
      new String[]{ 
       directoryPeople.LAST_NAME, 
       directoryPeople.FIRST_NAME, 
       directoryPeople.MIDDLE_NAME, 
       directoryPeople.JOB_TITLE}, 
      new int[]{ 
       R.id.txtLastName, 
       R.id.txtFirstName, 
       R.id.txtMiddle, 
       R.id.txtTitle} 
    ); 

    ListView av = (ListView)findViewById(R.id.listPeople); 
    av.setAdapter(adapter); 
    av.setFastScrollEnabled(true); 
    av.setTextFilterEnabled(true); 

    EditText etext=(EditText)findViewById(R.id.search_box); 
    etext.addTextChangedListener(new TextWatcher() { 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
     } 

     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     } 

     public void afterTextChanged(Editable s) { 
      ListView av = (ListView)findViewById(R.id.listPeople); 
      SimpleCursorAdapter filterAdapter = (SimpleCursorAdapter)av.getAdapter(); 
      filterAdapter.getFilter().filter(s.toString()); 
     } 
    }); 

    adapter.setFilterQueryProvider(new FilterQueryProvider() { 
     public Cursor runQuery(CharSequence constraint) { 
      return getDirectoryList(constraint); 
     } 
    }); 

और यहाँ getDirectoryList() है:

public Cursor getDirectoryList (CharSequence constraint) { 
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 
    queryBuilder.setTables(
     directoryPeople.PEOPLE_TABLE 
    ); 

    String asColumnsToReturn[] = { 
      directoryPeople.PEOPLE_TABLE + "." 
      + directoryPeople.LAST_NAME + "," + 
      directoryPeople.PEOPLE_TABLE + "." 
      + directoryPeople.FIRST_NAME + "," + 
      directoryPeople.PEOPLE_TABLE + "." 
      + directoryPeople.MIDDLE_NAME + "," + 
      directoryPeople.PEOPLE_TABLE + "." 
      + directoryPeople.JOB_TITLE + "," + 
      directoryPeople.PEOPLE_TABLE + "." 
      + directoryPeople._ID 
    }; 

    if (constraint == null || constraint.length() == 0) { 
     // Return the full list 
     return queryBuilder.query(mDB, asColumnsToReturn, null, null, 
       null, null, directoryPeople.DEFAULT_SORT_ORDER); 
    } else { 
     return mDB.query(directoryPeople.PEOPLE_TABLE, asColumnsToReturn, "LAST_NAME like '%'" + 
      constraint.toString() + "'%'", null, null, null, 
      "CASE WHEN LAST_NAME like '" + constraint.toString() + 
      "%' THEN 0 ELSE 1 END, LAST_NAME"); 
    } 
} 

मैं हर उदाहरण की कोशिश की और जवाब देने के मुझे अपनी खोजों में सामना करना पड़ा है, लेकिन कोई लाभ नहीं हुआ। यह निराशाजनक है, जैसा कि आप कल्पना कर सकते हैं। किसी भी व्यक्ति के लिए अग्रिम धन्यवाद जो मदद कर सकता है!

} else { 
    String value = "%"+constraint.toString()+"%"; 

    return mDB.query(directoryPeople.PEOPLE_TABLE, asColumnsToReturn, "LAST_NAME like ? ", new String[]{value}, null, null, null); 
} 

मैं अंतिम तर्क को छोड़ दिया, क्योंकि मैं क्या यह वास्तव में क्या करना चाहिए पता नहीं है:

"CASE WHEN LAST_NAME like '" + constraint.toString() + "%' THEN 0 ELSE 1 END, LAST_NAME" 

आप एमुलेटर में खोल में इस क्वेरी की कोशिश की है

उत्तर

14

इस तरह का प्रयास करें?

+0

मुझे सच में नहीं पता कि तर्क क्या करता है। मैंने उस उदाहरण को उस उदाहरण से कॉपी किया जो मैंने पाया और उस भाग को समझने के लिए बहुत थक गया था, इसलिए मैंने इसे छोड़ दिया। लेकिन अगर फ़िल्टर काम करता था और वह क्वेरी दोषपूर्ण थी, तो सूची दृश्य कम से कम नहीं बदला जाना चाहिए वैसे भी कुछ रास्ता? मैं आपके सुझाव की कोशिश करूंगा और वापस रिपोर्ट करूंगा। – LouieGeetoo

+0

यह आपके सुझाव के साथ काम कर रहा है! आपको नहीं पता कि मैं कितना खुश हूं। मैं इस पूरे समय बहुत करीब था। आपको बहुत - बहुत धन्यवाद! – LouieGeetoo

+0

यहां एमडीबी क्या है? SimpleCursorAdapter के लिए उपयोग किए जाने वाले एक ही डेटाबेस सहायक का उपयोग करके मुझे "fillWindow() त्रुटि में अमान्य वक्तव्य" मेरी सूचीत्मकता में, मैंने mDbHelper का एक उदाहरण उपयोग किया है जो मेरा डेटाबेस हैल्पर है। मैं c = mDbHelper.fetchAllFriends() के बाद एक कॉलमैनिंग कर्सर() के बाद कॉल करता हूं, मेरी सूची सक्रियता पर। क्या मुझे runQuery() में कॉल के लिए mDbHelper का एक नया उदाहरण घोषित करना चाहिए? – rohitmishra

संबंधित मुद्दे