2013-03-18 72 views
0

我有一個Listview顯示我的數據庫中的所有數據。我目前有一個過濾器onTextChanged過濾用戶輸入的字符串的方法。直到我覆蓋活動類的onResume()方法爲止,這完全奏效。當用戶點擊後退按鈕時,我已使用此onResume()重新加載ListviewListview過濾器被忽略onResume()

正如沒有onResume所述,它的功能完美。使用onResume()過濾器被阻止。

這裏是我的代碼:

public class view extends ListActivity { 

    ImageButton searchButton; 
    EditText searchName; 
    ListView searchedListResults; 
    long idToPass; 
    String numReturned; 
    String email; 
    @Override 
    protected void onResume() { 
     super.onResume(); 

     list(); 
    } 

    SimpleCursorAdapter cursorAdapter; 
    DBHandler getCons; 

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

     searchedListResults = (ListView) findViewById(android.R.id.list); 

     list(); 

     searchName = (EditText) findViewById(R.id.inputName); 

     searchedListResults.setTextFilterEnabled(true); 

     searchName.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void afterTextChanged(Editable s) { 

      } 

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

      } 

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

       cursorAdapter.getFilter().filter(s.toString()); 
       // list(); 
       searchedListResults.refreshDrawableState(); 

      } 

     }); 

     getCons = new DBHandler(this, null, null); 

     cursorAdapter.setFilterQueryProvider(new FilterQueryProvider() { 
      public Cursor runQuery(CharSequence constraint) { 

       getCons.open(); 
       return getCons.getChanges(constraint.toString()); 

      } 

     }); 
     searchedListResults.setAdapter(cursorAdapter); 
    } 

    private void list() { 
     DBHandler DBsearchRef = new DBHandler(this, null, null); 

     DBHandler search = new DBHandler(this, null, null); 

     search.open(); 
     Cursor cursor = search.getData(); 
     search.close(); 
     startManagingCursor(cursor); 

     String[] from = new String[] { DBsearchRef.KEY_NAME, 
       DBsearchRef.KEY_TEL, DBsearchRef.KEY_EMAIL, 
       DBsearchRef.KEY_COMMENTS }; 
     int[] to = new int[] { R.id.txtNameSet, R.id.txtContactSet, 
       R.id.txtEmailSet, R.id.txtCommentSet }; 

     cursorAdapter = new SimpleCursorAdapter(this, R.layout.searchagain, 
       cursor, from, to); 
     searchedListResults.setAdapter(cursorAdapter); 
    } 
} 
+0

刪除onResume()中的list()。 onResume()在活動恢復時被調用。你回到了恢復的同一活動。設備方向更改時也會重新創建活動。所以還需要照顧這種情況。 – Raghunandan 2013-03-18 14:01:54

+2

簡歷上的notifydatasetchange – Sandy09 2013-03-18 14:04:35

回答

2

由於沒有規定的onResume它完美地發揮作用。使用onResume()過濾器被阻止。

調用onCreate()list()onResume()之間的區別是,你只在onCreate()設置FilterQueryProvider。所以當onResume()創建一個新的CursorAdapter它有一個過濾器...


提示

如果移動:

cursorAdapter.setFilterQueryProvider(new FilterQueryProvider() { 
    public Cursor runQuery(CharSequence constraint) { 
     getCons.open(); 
     return getCons.getChanges(constraint.toString()); 
    } 
}); 

list(),那麼你的代碼將按預期行事。


如果刪除了的onResume方法然後我結束了一個空白列表視圖被點擊回來時。

如果你有數據,「消失」當您返回到一個活動,那麼你必須自己onSaveInstanceState()onRestoreInstanceState()保存。它們使用起來非常簡單,以下是關於Recreating an Activity的開發者指南。


最後,你並不需要調用list()onResume()onCreate(),它在這兩個地方同樣的事情。目前它不會添加任何在onCreate()之後更改的功能,因此您可以完全刪除onResume()方法。

+1

http://developer.android.com/guide/topics/resources/runtime-changes.html#RainainingAnObject。另外,當屏幕方向更改時,您可以使用onSaveInstanceState()和onRestoreInstanceState()。另請檢查鏈接,特別是在配置更改期間保留對象下的主題。 – Raghunandan 2013-03-18 14:37:29

+0

@Sam這裏有一個偉大的信息,我肯定會讓我們所有人都受益。我可以看到我的onResume是如何影響冗餘的。我重寫SaveInstanceState和RestoreInstanceState方法實際上是否需要傳遞它們任何東西?我已經閱讀了Android文檔,看起來創建的包處理了重新創建活動時所有屏幕的變化。 – user1352057 2013-03-18 18:37:55

+0

我不明白你的意思是「我真的需要通過他們什麼嗎?」我可以回答很多不同的方法......點擊問題下方的[「edit」](http://stackoverflow.com/posts/15478659/edit),然後添加您當前使用的內容。然後在這裏發表評論,所以我知道你已經做到了。 – Sam 2013-03-18 19:06:04