2016-12-15 17 views
0

私はユーザー入力を行う目的で使用されるEditTextを持っています。ユーザーが特定のデータを入力すると、EditTextに関連付けられたテキスト変更リスナーは、リフレッシュされたカーソルを呼び出し、そのすぐ下に配置されたListViewに表示されている結果を更新しようとします。Sqliteデータベースのカーソルが更新されると、ListViewが頻繁にハングします

すべては問題ありません。しかし、検索クエリの変更が発生するたびに、結果のカーソルとListViewの更新には時間がかかります。たとえば、n秒です。 n秒の間、UIは停止します(呼び出しがあれば停止します)。リフレッシュされたカーソルが使用可能になり、ListView全体が入力されるまで応答しません。

カーソルの更新を別のスレッドに入れようとしたとき、UIスレッドが他のスレッドの実行を許可していないため、UIに反映されませんでした。リストの更新などのUIアクティビティは、MainActivityクラスのrunOnUiThreadを通じて実装する必要があります。

ユーザがEditTextを変更できるようにする方法や、更新されたカーソルがリストビューをリフレッシュすることができるようにするには、前者に影響を与えないでください。

答えて

0

基本的に、間違ったアプローチを試みています。リストのデータをSQLiteデータベースクエリから直接取得する場合は、CursorAdapterを使用できます。

今すぐアダプタ

public class MyCursorAdapter extends CursorAdapter { 

    // Default constructor 
    public MyCursorAdapter(Context context, Cursor cursor, int flags) { 
     ... 
    } 

    public void bindView(View view, Context context, Cursor cursor) { 
     ... 
    } 

    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     ... 
     return null; 
    } 
} 

Get Values from database 
Cursor todoCursor = db.rawQuery("SELECT * FROM todo_items", null); 

を作成し、我々はリストビューにアイテムの配列を表示するために活動してCursorAdapterを使用することができます。

// Find ListView to populate 
ListView lvItems = (ListView) findViewById(R.id.lvItems); 
// Setup cursor adapter using cursor from last step 
TodoCursorAdapter todoAdapter = new TodoCursorAdapter(this, todoCursor); 
// Attach cursor adapter to the ListView 
lvItems.setAdapter(todoAdapter); 
This will then trigger the CursorAdapter iterating through the result set and populating the list. We can change the cursor to update the adapter at any time with: 

// Switch to new cursor and update contents of ListView 
todoAdapter.changeCursor(newCursor); 
+0

私はCursorAdaptorを使用してbindView方法にしています私はすべてのことをやっています。しかし、依然として400行を返すクエリの結果をフェッチしている間は、他のUI機能がハングした状態にある時間がかかります。 –

+0

textChangeListnerを使用しましたか? –

+0

内容を反映するためにobseverを使用してください。 400レコードは関係ありません。制限と改ページを使用できます –

関連する問題