2013-03-18 94 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