簡體   English   中英

來自Sqlite DB android的多列listview

[英]multiple columns listview from Sqlite DB android

我正在使用一個包含三個表的數據庫,學生,答案,問題答案表包含了Studentid,questionid,answer我使用這三個表在SQLITE中構建了一個數據庫,因此在加載應用程序時,我將設置學生並檢查答案。 問題在於從該表中獲取歷史記錄,在ListView中,我之前使用過適配器,但是在僅從表中直接顯示信息之前這很容易,但是對於表答案,我必須獲取Studentid並顯示名稱,獲取questionid並顯示問題本身。 適配器不起作用,因為該類沒有我想要顯示的東西,所以我制作了一種方法,可以為我提供所需的信息:

public ArrayList getTableHisto() {
        ArrayList lst = new ArrayList();
        int zise = lst.size();
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor c = db.rawQuery(" SELECT Q." + KEY_QUESTION + " , U." + KEY_NOM + " , U." + KEY_PRENOM + " , A." + KEY_DATE + " , " + KEY_REPONSE + " from " + TABLE_QUESTION + " Q, " + TABLE_USER + " U, " + TABLE_ANSWER + " A WHERE Q." + KEY_ID_QUESTION + " = A." + KEY_ID_QUESTION + "AND A." + KEY_MATRICULE + " = U." + KEY_MATRICULE, null);
        if (c.moveToFirst()) {
            while (c.isAfterLast() == false) {
                String nom = c.getString(c.getColumnIndex(KEY_NOM)).toString();
             //   String prenom = c.getString(c.getColumnIndex(KEY_PRENOM)).toString();
                String quest = c.getString(c.getColumnIndex(KEY_QUESTION)).toString();
                String reponse = c.getString(c.getColumnIndex(KEY_REPONSE)).toString();
                String date = c.getString(c.getColumnIndex(KEY_DATE)).toString();
                lst.add(nom);
               // lst.add(prenom);
                lst.add(quest);
                lst.add(reponse);
                lst.add(date);


                c.moveToNext();

            }

        }
        return lst;
    }

我認為這是可行的,因為我嘗試了sql查詢,但是問題是要使其適應於histrow.java中具有四列的ListView:

 <LinearLayout
        android:layout_width="368dp"
        android:layout_height="495dp"
        android:orientation="horizontal"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="8dp">

        <TextView
            android:id="@+id/hname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="nom" />

        <TextView
            android:id="@+id/hquest"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="ques" />

        <TextView
            android:id="@+id/hrep"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="rep" />

        <TextView
            android:id="@+id/hdate"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="date" />

    </LinearLayout>

歷史記錄頁面上只有ID為List的ListView:hist如果有人有任何想法,請不要猶豫。 謝謝

您需要使用定制的適配器或使用CursorAdapter,后者可能是最簡單的,因為他們不需要對其進行定制。

使用CursorAdapter

如果您使用CursorAdapter,則不是直接從提取的Cursor中構建ArrayList,而是直接使用Cursor。

你可以有 :-

public Cursor getTableHistoAsCursor() {
    SQLiteDatabase db = this.getReadableDatabase();
    return db.rawQuery(" SELECT Q." + KEY_QUESTION + " , U." + KEY_NOM + " , U." + KEY_PRENOM + " , A." + KEY_DATE + " , " + KEY_REPONSE + " from " + TABLE_QUESTION + " Q, " + TABLE_USER + " U, " + TABLE_ANSWER + " A WHERE Q." + KEY_ID_QUESTION + " = A." + KEY_ID_QUESTION + "AND A." + KEY_MATRICULE + " = U." + KEY_MATRICULE, null);
}

各自的活動可以是:

public class MainActivity extends AppCompatActivity {

    DatabaseHelper mDBHlpr; //<<<< Note 1
    SimpleCursorAdapter mSCA;
    Cursor mCsr;
    ListView mListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); //<<<< Note 2

        mListView = (ListView) findViewById(R.id.yourlistview); //<<<< Note 3
        mDBHlpr = new DatabaseHelper(this);  //<<<< Note 1

        mCsr = mDBHlpr.getTableHistoAsCursor();

        mSCA = new SimpleCursorAdapter(this,
                 R.layout.yourlayout, //<<<< Note 2
                 new String[]{KEY_NOM, KEY_QUESTION, KEY_REPONSE, KEY_DATE}, //<<<< Note 4
                 new int[]{R.id.hname, R.id.hquest, R.id.hrep, R.id.hdate}, //<<<< Note 5
                 0
        );
        mListView.setAdapter(mSCA);    
}

筆記

  • 注意1-更改DatabaseHelper以反映您的databasehelper。
  • 注意2-更改布局以反映您的布局。
  • 注意3-更改以獲取適當的列表視圖。
  • 注意4-這是要從中提取數據的列名稱的字符串數組。 與注釋5有直接關系。
  • 注釋5-提取的數據(根據注釋4)將放置到的視圖的ID。 也就是說,第一列用於將數據放入第一個視圖,第二列用於將數據放入第二個視圖,依此類推。
    • 可能需要對KEY_NOMKEY_QUESTION等進行進一步限定,例如DatabaseHelper.KEY_NOM (注1),或更改為使用硬編碼的字符串,例如"name""question"等,具體取決於定義方式。
  • 注意6-上面是未經測試的代碼,因此可能會出現錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM