我使用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
答案 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
陈旧且笨重。