2012-04-13 103 views
0

我知道這已被引入很多次,但我不能得到它的工作。搜索過濾功能似乎無法與我的ListView正常工作。任何人都可以幫我理解我的代碼中有什麼問題嗎?即使在我的EditText字段中輸入文本後,結果仍然可以從我的數據庫中得到很好的結果,但不會被過濾。我試着用關於Watcher的關鍵更改來測試EditText,除了我的列表過濾外,它工作正常。編輯文本與列表視圖

備受讚賞。

public class Interface extends Activity implements OnClickListener, 
    AdapterView.OnItemClickListener { 

MyDbHelper mHelper; 
SQLiteDatabase mDb; 
Cursor mCursor; 
SimpleCursorAdapter mAdapter, madapter; 
ListView mList; 
EditText returnsearch; 
int textlength = 0; 

public static final String TABLE_NAME = "hohom"; 
public static final String COL_SanID = "SandIdc"; 
public static final String COL_SanTitle = "SandTitleC"; 
public static final String COL_SanCat = "SandCatC"; 
public static final String COL_SanReadyin = "SandReadyinC"; 
public static final String COL_SandServing = "SandServingC"; 
public static final String COL_SandIngred = "SandIngredC"; 
public static final String COL_SandDirect = "SandDirectC"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.recipesearch); 

    mHelper = new MyDbHelper(this); 
    mList = (ListView) findViewById(R.id.listlist); 
    mList.setOnItemClickListener(this); 
    mList.setTextFilterEnabled(true); 


    returnsearch = (EditText) findViewById(R.id.searchrecipe); 

    Bundle extrass = getIntent().getExtras(); 

    mDb = mHelper.getWritableDatabase(); 

    String Type = extrass.getString("CategoryType"); 

    String[] columns = new String[] { 

    "_id", COL_SanID, COL_SanTitle, COL_SanCat, COL_SanReadyin, 
      COL_SandServing, COL_SandIngred, COL_SandDirect }; 

    mCursor = mDb.query(TABLE_NAME, columns, COL_SanCat + "=" + "?", 
      new String[] { Type }, null, null, null); 

    final String[] headers = new String[] { MyDbHelper.COL_SanTitle, 
      MyDbHelper.COL_SanReadyin, MyDbHelper.COL_SandServing }; 

    mAdapter = new SimpleCursorAdapter(this, R.layout.listtype, mCursor, 
      headers, new int[] { R.id.listmaintitle, R.id.listreadyin, 
        R.id.listserving }); 

    mList.setAdapter(mAdapter); 

} 

@Override 
protected void onResume() { 

    super.onResume(); 

    returnsearch.addTextChangedListener(new TextWatcher() { 

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

      mAdapter.getFilter().filter(s); 
     } 

     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 

     } 

     public void afterTextChanged(Editable s) { 

      mAdapter.getFilter().filter(s); 
      mAdapter.notifyDataSetChanged(); 
     } 
    }); 
} 

public void onClick(View v) 

{ 

} 

public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
    mCursor.moveToPosition(position); 

    Intent b = new Intent(Interface.this, Recipe.class); 

    String rowId = mCursor.getString(0); 
    String Title = mCursor.getString(2); 
    String Category = mCursor.getString(3); 
    String Readyin = mCursor.getString(4); 
    String Serving = mCursor.getString(5); 
    String Ingredients = mCursor.getString(6); 
    String Directions = mCursor.getString(7); 

    b.putExtra("Title", Title); 
    b.putExtra("Category", Category); 
    b.putExtra("Readyin", Readyin); 
    b.putExtra("Serving", Serving); 
    b.putExtra("Ingredients", Ingredients); 
    b.putExtra("Directions", Directions); 

    startActivity(b); 

} 

} 
+0

您是否正在嘗試構建AutoCompleteTextView,但使用EditText和ListView? – Sam 2012-04-13 23:22:55

+0

不,我只是想建立一個列表視圖,其中包含基於類別從數據庫中拉出的項目,我可以基於EditText搜索限制食譜的數量。例如:當用戶輸入Burger時,所有以Burger開頭的項目都出現在列表視圖中。非常感謝! – 2012-04-13 23:50:51

+0

好吧,我建議在你的SimpleCursorAdapter中添加一個'FilterQueryProvider',這將告訴ListView它應該如何更新。 – Sam 2012-04-13 23:56:36

回答

0

也許這就是你需要:

mAdapter.setFilterQueryProvider(
    new FilterQueryProvider() { 
     public Cursor runQuery(CharSequence constraint) { 
      return mDb.query(TABLE_NAME, columns, COL_SanCat + " = ? AND " + COL_SandIngred + " = ?", new String[] { Type, "%" + constraint + "%" }, null, null, null); 
     } 
    } 
); 

編輯

我加入了關鍵字回報,所以可能編譯,對不起。無論如何,如果用戶輸入「泡菜」,這應該顯示所有包含泡菜的三明治。

+0

謝謝你的回答。我正在嘗試實現這一點。但我只需要確定這是否將在Watcher方法下實現?謝謝! – 2012-04-14 00:37:14

+0

現在嘗試了一個簡單的查詢,它確實得到了一些只按類別排序的結果(它僅用於測試),但我意識到,當我嘗試在edittext中輸入任何字母時,所有結果都會消失,如果我編寫所需的單詞字)正確顯示已過濾的項目。我如何消除這種情況?我希望所有項目都出現,直到用戶完成單詞(如果確實有匹配的話)。謝謝! – 2012-04-14 00:45:45

+0

嗯,如果你忽略FilterQueryProvider並嘗試更新'mCursor = mDb.query(TABLE_NAME,columns,COL_SanCat +「=」+「?」, new String [] {s.toString()},null,null, null);'在你的afterTextChanged函數?我從來沒有使用文本偵聽器,雖然... – Sam 2012-04-14 00:51:09

相關問題