SQLiteDatabase从2个表列中更改ListView中的两个文本视图

时间:2017-01-08 22:22:28

标签: android sqlite listview

我使用SQLiteDatabase在一个表( COL_TASK_TITLE COL_TASK_WEIGHT )下记录两种类型的数据。然后我使用ArrayAdapter将2个TaskEntry的字符串设置为2个相关的TextViews( characterNameDisplay characterWeightDisplay )。这些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?

e.g。 characterWeightDisplay COL_TASK_WEIGHT ;和 characterNameDisplay COL_TASK_TITLE

1 个答案:

答案 0 :(得分:0)

您正在使用List<String>并将任务名称和任务权重添加为此列表的各个元素。 ArrayAdapter(或其他任何东西)无法知道两个相邻的项是相关的 - 所有内容看起来都像列表中的各个元素。

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

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

然后,当您处理Cursor时,您会改为列出Task

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<Task>。但是,现在这个适配器可能没有必要的逻辑来将Task绑定到您为列表行定义的布局。至少,你必须覆盖getView()并自己实现。

在我看来,值得不使用ArrayAdapter,因为它对于大多数应用程序来说通常过于简单;相反,你应该继承BaseAdapter。更好的方法是使用RecyclerView代替ListView并延伸RecyclerView.Adapter,因为ListView陈旧且笨重。