0

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

1 に答える 1

2

onResume なしで述べたように、完全に機能します。onResume() を使用すると、フィルターがブロックされます。

list()in onCreate()と inの呼び出しの違いはonResume()、 では FilterQueryProvider のみを設定することですonCreate()。そのため、新しい CursorAdapter を作成すると、フィルターがonResume()ありません...


チップ

移動する場合:

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

にするlist()と、コードは期待どおりに動作します。


onresume メソッドを削除すると、戻るをクリックすると空のリストビューになります。

アクティビティに戻ったときに「消える」データがある場合は、 と に自分で保存する必要がonSaveInstanceState()ありonRestoreInstanceState()ます。使い方はとても簡単です。アクティビティの再作成に関する開発者ガイドはこちらです。


list()最後に、 との両方 onResume()を呼び出す必要はありませんonCreate()。両方の場所で同じことを行います。現在、後で変更される機能は追加されないため、メソッドを完全にonCreate()削除できます。onResume()

于 2013-03-18T14:29:52.783 に答える