【问题标题】:multiple columns listview from Sqlite DB android来自Sqlite DB android的多列listview
【发布时间】:2017-11-24 12:54:56
【问题描述】:

我正在使用包含三个表的数据库,学生、答案、问题 答案表包含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 为 hist 的 ListView 如果有人有任何想法,请不要犹豫。 谢谢

【问题讨论】:

    标签: android sqlite listview


    【解决方案1】:

    您需要使用自定义适配器或使用 CursorAdapter,后者可能是最简单的,因为他们不需要自定义它。

    使用 CursorAdapter

    如果您使用 CursorAdapter,那么您可以直接使用 Cursor,而不是从提取的 Cursor 构建 ArrayList。

    你可以:-

    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 - 这是列名 from 的字符串数组,要从中提取数据。与注 5 有直接关系。
    • 注 5 - 要放置提取数据(根据注 4)的视图的 ID。即第一列用于将数据放入第一个视图,第二列用于第二个视图,依此类推。
      • KEY_NOMKEY_QUESTION 等可能需要进一步限定,例如DatabaseHelper.KEY_NOM(注 1)或更改为使用硬编码字符串,例如"name""question" 等,具体取决于定义方式。
    • 注 6 - 以上是未经测试的代码,因此可能存在错误。

    【讨论】:

    • 对不起,我的实习不在了,我现在就试试,把答案发回给你。非常感谢。
    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    相关资源
    最近更新 更多