onResume()忽略Listview过滤器

时间:2013-03-18 13:59:52

标签: java android

我有Listview显示数据库中的所有数据。我目前有一个过滤器onTextChanged方法,用于过滤用户输入的字符串。这完全有效,直到我覆盖活动类的onResume()方法。当用户点击后退按钮时,我已使用此onResume()重新加载Listview

如上所述,没有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);
    }
}

1 个答案:

答案 0 :(得分:2)

  

如上所述没有onResume它完美地运作。使用onResume()过滤器被阻止。

list()onCreate()中调用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()方法。