2017-09-01 13 views
0

同じアクティビティで2つの異なるリストビューにカーソルを表示する方法はありますか?一例は、Whatsappの「Chats」テーブルと「Messages」テーブルがある(私が推測する)場所です。ツールバーにキーワードを入力すると、両方のテーブルを照会し、1つのアクティビティで2つの異なるリストビューに表示します。これを行う方法はありますか?または、彼らは1つの単一のリストビューでのみ表示されますか?ご意見をお聞かせください。Android Display Cursorの結果1つのアクティビティで2つの異なるリストビューが表示される

ありがとうございます。

Whatsapp

答えて

1

はい、これは行うことができます。単純な方法で上記を模倣するには、データベースに2つのテーブルのチャットとメッセージがあると仮定します。彼らは両方とも、2つの列に一意の識別子とテキストの列を持っています。 SQLiteOpenHelperのサブクラスを使用して

我々としてDBHlpr.javaという名前のファイルを持つことができます: - onCreate方法がCHATTABLEあたりとして(2つのテーブルすなわちチャットメッセージを作成します

public class DBHlpr extends SQLiteOpenHelper { 

    static final String DBNAME = "mydb"; 
    static final String CHATTABLE = "chats"; 
    static final String MSGTABLE = "messages"; 

    static final String TEXTCOL = "textdata"; 
    static final String IDCOL = "_id"; 


    DBHlpr(Context context) { 
     super(context,DBNAME,null,1); 
    } 

    public void onCreate(SQLiteDatabase db){ 
     db.execSQL("CREATE TABLE " + CHATTABLE + " (" + IDCOL + " INTEGER PRIMARY KEY, " + TEXTCOL + " TEXT)"); 
     db.execSQL("CREATE TABLE " + MSGTABLE + " (" + IDCOL + " INTEGER PRIMARY KEY, " + TEXTCOL + " TEXT)"); 
    } 

    public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) { 
    } 

    public void insertRow(String table, String text) { 
     ContentValues cv = new ContentValues(); 
     cv.put(TEXTCOL,text); 
     long id = this.getWritableDatabase().insert(table,null,cv); 
     Log.d("DBHLP-INSRT","Added row with ID=" + Long.toString(id)); 
    } 

    public Cursor getRows(String table, String srchstr) { 

     SQLiteDatabase db = getWritableDatabase(); 

     String whereclause = null; 
     if (srchstr.length() > 0) { 
      whereclause = TEXTCOL + " LIKE '%" + srchstr + "%' "; 
     } 
     return db.query(
       table, 
       null,whereclause,null,null,null,null); 
    } 
} 

およびMSGTABLE)。

onUpgrade is required but does nothing as yet.

insertRowは(どちらも同じ構造を有しているように)のいずれかのテーブルに行を追加するために使用することができます。挿入が簡単に確認できるようにログに書き込むことに注意してください。

getRowsは、データを含むカーソル(データベースからのデータ)を取得するために使用されます。ここでも、この1つの方法を両方のテーブルに使用できます。これは、(検索フィールドに入力されたデータごとに)テーブルをフィルタリングするために使用される文字列(長さが0より大きい場合)に渡されます。

活動が、この場合には、それは特別なものは何もありませんactivity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="mjt.so45787986.MainActivity"> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Search" /> 
    <EditText 
     android:id="@+id/search" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Chats" /> 
    <ListView 
     android:id="@+id/chats" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1"> 
    </ListView> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Messages" /> 
    <ListView 
     android:id="@+id/messages" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1"> 
    </ListView> 
</LinearLayout> 

なり、2つのリストビューを指定したレイアウトが必要になります、それは検索のためのEditTextで、非常にシンプルなレイアウトですテキスト・ビューをチャット・リスト(次のListView)の見出しとして、次にメッセージ用の別のTextViewおよびListViewとして評価します。

MainActivity.javaは次のようになります -

public class MainActivity extends AppCompatActivity { 

    DBHlpr dbhlpr = new DBHlpr(this); 
    Cursor chatcursor; 
    Cursor msgcursor; 
    TextWatcher tx; 
    EditText search; 
    ListView chatlist; 
    ListView msglist; 
    SimpleCursorAdapter chat_sca; 
    SimpleCursorAdapter msg_sca; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     search = (EditText) findViewById(R.id.search); 
     chatlist = (ListView) findViewById(R.id.chats); 
     msglist = (ListView) findViewById(R.id.messages); 


     // Add some data for testing 

     dbhlpr.insertRow(DBHlpr.CHATTABLE, "This is my first chat"); 
     dbhlpr.insertRow(DBHlpr.CHATTABLE, "This is my second chat"); 
     dbhlpr.insertRow(DBHlpr.CHATTABLE, "This is my third chat"); 
     dbhlpr.insertRow(DBHlpr.MSGTABLE, "First Message"); 
     dbhlpr.insertRow(DBHlpr.MSGTABLE, "Second Message"); 
     dbhlpr.insertRow(DBHlpr.MSGTABLE, "Third Message"); 

     chatcursor = dbhlpr.getRows(DBHlpr.CHATTABLE,""); 
     chat_sca = new SimpleCursorAdapter(
       this, 
       android.R.layout.simple_list_item_1, 
       chatcursor, 
       new String[]{DBHlpr.TEXTCOL}, 
       new int[]{android.R.id.text1}, 
       0 
       ); 
     chatlist.setAdapter(chat_sca); 
     msgcursor = dbhlpr.getRows(DBHlpr.MSGTABLE,""); 
     msg_sca = new SimpleCursorAdapter(
       this, 
       android.R.layout.simple_list_item_1, 
       msgcursor, 
       new String[]{DBHlpr.TEXTCOL}, 
       new int[]{android.R.id.text1}, 
       0 
     ); 
     msglist.setAdapter(msg_sca); 

     search.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
      } 

      @Override 
      public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
       refreshCursors(); 
      } 

      @Override 
      public void afterTextChanged(Editable editable) { 

      } 
     }); 
    } 

    private void refreshCursors() { 
     chatcursor = dbhlpr.getRows(DBHlpr.CHATTABLE,search.getText().toString()); 
     chat_sca.swapCursor(chatcursor); 
     msgcursor = dbhlpr.getRows(DBHlpr.MSGTABLE,search.getText().toString()); 
     msg_sca.swapCursor(msgcursor); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     chatcursor.close(); 
     msgcursor.close(); 
    } 
} 

まず、いくつかのクラス変数が定義されています -

DBHlpr dbhlpr = new DBHlpr(this); 
    Cursor chatcursor; 
    Cursor msgcursor; 

は、データベースに関連しています。最初はDBHlprのインスタンスを作成し、残りの2つは2つのカーソル(チャットとメッセージ)用です。

TextWatcher tx; 
EditText search; 
ListView chatlist; 
ListView msglist; 

ビューを処理するためのものです。 TextWatcherは、検索の変更を検出するために使用されます。

SimpleCursorAdapter chat_sca; 
    SimpleCursorAdapter msg_sca; 

ListViewsにデータベースデータを適合させるためのものです。名前が示すように、これらはかなり基本的ですが、デモンストレーションのために行います。

onCreateの最初の5行はかなり標準的です。

次の6行はすべて基本的に同じdbhlpr.insertRow(DBHlpr.CHATTABLE, "This is my first chat");と同じであり、それぞれのテーブルと格納されるデータを渡すinsertRowメソッドを呼び出します。最初に実行されるのは、データベースが作成されるときです。これらの行は、いくつかのテストデータを提供するためだけに存在します。

その後、我々は(これは基本的に繰り返され、次が、メッセージテーブルのコードを注意してください)に来て: -

chatcursor = dbhlpr.getRows(DBHlpr.CHATTABLE,""); 
    chat_sca = new SimpleCursorAdapter(
      this, 
      android.R.layout.simple_list_item_1, 
      chatcursor, 
      new String[]{DBHlpr.TEXTCOL}, 
      new int[]{android.R.id.text1}, 
      0 
      ); 
    chatlist.setAdapter(chat_sca); 

最初の行は、あたりとして、それぞれのデータ(すべてのチャット行でカーソルを取得します第2パラメータ)。 2番目〜9番目の行は、単純カーソルAdapaterを設定する単一のコマンドです(1番目のパラメータはコンテキスト、2番目は使用するレイアウト(簡単なものを使用します)、3番目はデータを保持するCursor、4番目はカーソル内のデータを取得する列、5番目はデータが配置されるビューID、6番目は0でなければなりません)。 最後の行は、アダプタを使用するようにListViewに指示します。

これに続いて、TextWatcherが検索に追加されます。ここでは、refreshCursorsメソッドを呼び出すonTextChangedメソッドが使用されています。

refreshCursorsメソッドは、変更された検索データを使用して、データベースから既存のカーソルにデータを取得し、データが変更されたことをswapCursorによってadpaterに通知します。

最後に、onDestroyメソッドは、アクティビティが終了しようとしているときにカーソルを閉じるために使用されます。

最初に実行します - 検索フィールドにFを入力した後

enter image description here

を: -

enter image description here

+0

ありがとうございました。 @MikeT。 –

関連する問題