来自Sqlite DB android的多列listview

时间:2017-11-24 12:54:57

标签: android sqlite listview

我使用的数据库有三个表,学生,答案,问题 答案表包含studentid,questionid,answer 我在SQLITE中用三个表构建了一个数据库,所以当加载应用程序时,我设置学生去检查答案。 问题是从这个表中获取历史记录,在ListView中,我之前使用过一个适配器,但在它显示从表中显示的直接信息之前很容易,但是对于表的答案,我必须得到studentntid和显示名称,获取问题并显示问题本身。 适配器不起作用,因为类没有我想要显示的相同的东西,所以我创建了一个方法,可以给我我想要的信息:

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 如果有人有任何想法,请不要犹豫。 感谢

1 个答案:

答案 0 :(得分:0)

您需要使用自定义适配器或使用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以反映您的数据库帮助。
  • 注意2 - 更改布局以反映您的布局。
  • 注3 - 更改以获取适当的列表视图。
  • 注4 - 这是一个字符串数组,列名来自,用于提取数据。与Note 5有直接关系。
  • 注5 - 要放置提取数据(根据注释4)的视图的id。即第一列用于将数据放入第一个视图,第二列用于放入第二个视图,依此类推。
    • KEY_NOMKEY_QUESTION等可能需要进一步限定,例如DatabaseHelper.KEY_NOM(注1)或更改为使用硬编码字符串,例如"name""question"等取决于如何定义。
  • 注6 - 以上是未经测试的代码,因此可能存在错误。