【问题标题】:SQLiteDatabase Change Two Text Views in a ListView From 2 Table ColumnsSQLiteDatabase 从 2 个表列更改 ListView 中的两个文本视图
【发布时间】:2017-01-09 07:19:34
【问题描述】:

我正在使用 SQLiteDatabase 在单个表下记录 2 种类型的数据(COL_TASK_TITLECOL_TASK_WEIGHT)。然后,我使用 ArrayAdapter 将 2 个 TaskEntry 的字符串设置为它们的 2 个相关 TextView(characterNameDisplaycharacterWeightDisplay)。这些 TextView 都是同一个 ListView 元素 (item_todo) 的一部分。

这是我调用来更新 ListView 的方法:

public void updateUI() {
    ArrayList<String> taskList = new ArrayList<>();
    SQLiteDatabase db = mHelper.getReadableDatabase();
    Cursor cursor = db.query(TaskContract.TaskEntry.TABLE,
            new String[]{TaskContract.TaskEntry._ID, TaskContract.TaskEntry.COL_TASK_TITLE, TaskContract.TaskEntry.COL_TASK_WEIGHT},
            null, null, null, null, null);
    while (cursor.moveToNext()) {
        int idx = cursor.getColumnIndex(TaskContract.TaskEntry.COL_TASK_TITLE);
        taskList.add(cursor.getString(idx));
        int idx1 = cursor.getColumnIndex(TaskContract.TaskEntry.COL_TASK_WEIGHT);
        taskList.add(cursor.getString(idx1));
    }

    if (mAdapter == null) {
        mAdapter = new ArrayAdapter<>(this,
                R.layout.item_todo,
                R.id.characterNameDisplay,
                taskList);

        mTaskListView.setAdapter(mAdapter);

    } else {
        mAdapter.clear();
        mAdapter.addAll(taskList);
        mAdapter.notifyDataSetChanged();
    }
    cursor.close();
    db.close();
}

目前,它正在将两个 TaskEntry 设置为单独的 ListView 段中的 characterNameDisplay TextView。

我的问题是;如何正确地将每个 TextView 设置为其相关的 TaskEntry?

例如characterWeightDisplayCOL_TASK_WEIGHT;和 characterNameDisplayCOL_TASK_TITLE

【问题讨论】:

    标签: android sqlite listview


    【解决方案1】:

    您正在使用List&lt;String&gt; 并将任务名称和任务权重添加为该列表的单个元素。 ArrayAdapter(或其他任何东西)无法知道两个相邻的项目是相关的——一切看起来都像是列表中的单个元素。

    你应该创建一个类来封装任务的属性:

    class Task {
        String name;
        String weight;
        // add more as needed
    }
    

    然后,当您处理光标时,您会创建一个Tasks 列表:

    List<Task> taskList = new ArrayList<>();
    while (cursor.moveToNext()) {
        String name = cursor.getString(cursor.getColumnIndex(COL_TASK_TITLE));
        String weight= cursor.getString(cursor.getColumnIndex(COL_TASK_WEIGHT));
        Task task = new Task();
        task.name = name;
        task.weight = weight;
        taskList.add(task);
    }
    

    这也意味着您的适配器将改为ArrayAdapter&lt;Task&gt;。但是,现在这个适配器可能没有必要的逻辑来将Task 绑定到您为列表行定义的布局。至少,您必须重写 getView() 并自己实现它。

    在我看来,不使用ArrayAdapter 是值得的,因为它对于大多数应用程序来说通常太简单了;相反,您应该继承BaseAdapter。更好的是使用RecyclerView 而不是ListView 并扩展RecyclerView.Adapter,因为ListView 既旧又笨重。

    【讨论】:

    • 如你所见,我会研究 RecyclerView 并用它替换我的 ListView。 RecyclerView 会要求我更改我的 SQLiteDatabase 吗?
    • @TomJames 这里讨论的所有内容都与 UI 有关,它们都不需要对存储持久数据的方式进行任何更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多