2011-03-16 27 views
23

我想過濾一個SimpleCursorAdapter驅動的ListView,它上面有一個EditText框。我有下面的代碼,但是當我輸入框時,什麼也沒有發生;完整列表繼續顯示。我究竟做錯了什麼?ListView,SimpleCursorAdapter,一個EditText過濾器 - 它爲什麼不做任何事情?

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"); 
    } 
} 

我已經想盡例子並回答我遇到我的搜索,但都無濟於事。正如你可以想象的那樣令人沮喪。在此先感謝任何可以幫助的人!

回答

14

試試這個方法:

} 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" 

您是否嘗試過這個查詢殼在模擬器?

+0

我真的不知道這個論點是幹什麼的。我從我發現的一個例子中複製了這一點,並且當時太累了以找出那個部分做了什麼,所以我將它留下了。但是,如果過濾器工作並且該查詢有問題,那麼不應該ListView至少改變反正有什麼辦法?我會嘗試你的建議並回報。 – LouieGeetoo 2011-03-16 16:55:15

+0

這是你的建議!你不知道我有多開心。我整個時間都很親密。非常感謝! – LouieGeetoo 2011-03-17 06:25:00

+0

這是什麼mDB?使用與用於SimpleCursorAdapter的數據庫幫助程序相同的數據庫幫助程序給我一個「fillWindow()中的無效語句錯誤」 在我的列表活動中,我使用了一個mDbHelper實例,它是我的DatabaseHelper。我調用了c = mDbHelper.fetchAllFriends(),後面跟着我的listActivity的onCreate中的startManagingCursor()。 我應該爲runQuery()中的調用聲明一個mDbHelper的新實例嗎? – rohitmishra 2012-02-24 13:40:02

相關問題