安卓& Kotlin Books 安卓Apprentice

10
完成详细信息视图 由Darryl Bayliss撰写

在最后一章中,您可以设置新的活动以显示列表的内容。目前,该活动是空的。

在本章中,您将使用熟悉的组件(例如Recyclerview)添加到该活动以显示列表,以及将任务添加到列表中的FloationActionButton。您还将学习如何使用意图返回上一项活动。

入门

如果你有自己的项目下面一起,打开它,请在使用本章节。如果不是,请不要担心。找到 项目 本章的文件夹并打开 Listmaker. 内部应用程序 起动机 folder.

打开该项目的第一次,Android的工作室需要几分钟的时间来设置环境并更新其依赖关系。

打开 listdetailactivity.kt. 并查看其内容。

目前,您可以通过列表 mainactivity.kt. 通过意图并将活动标题设置为列表的名称。这很好,但这项活动需要做更多。对于初学者,它需要让用户查看列表中的所有项目,以及添加新项目。

您可以完成第一个任务 - 查看所有项目 - 使用Recyclerview。

打开 Activity_list_detail.xml. 来自 res /布局 文件夹,并显示 设计 如果尚未选择“布局”窗口中的视图。

在“调色板”窗口中,选择 常见的 左侧列表中的选项。您将看到recyclerview可用于在右侧列表中选择。

单击并拖动 recyclerview. 到布局窗口右侧显示的布局中的空格。

使用RecyClerview添加,您需要给它一个ID和一些维度。在里面 属性 窗口,改变 ID recyclerview to list_items_recyclerview..

接下来,更新 layout_width.layout_height.0dp match_constraint.。这可确保recyclerview遵循您即将设置的约束,并且它占据了整个屏幕。

在约束窗口小部件中,单击四个 + 广场周围的按钮为recyclerview添加约束。改变 边缘 每个约束 0.

使用Recyclerview设置在布局中,是时候在代码中使用它了。

编码recyclerview.

打开 listdetailactivity.kt.。在课程的顶部,添加一个属性以对RecyClerview进行引用:

lateinit var listItemsRecyclerView : RecyclerView
// 1
listItemsRecyclerView =
    findViewById(R.id.list_items_recyclerview.)
// 2
listItemsRecyclerView.adapter = ListItemsRecyclerViewAdapter(list)
// 3
listItemsRecyclerView.layoutManager = LinearLayoutManager(this)

class ListItemsRecyclerViewAdapter(var list: TaskList) : RecyclerView.Adapter<ListItemViewHolder>()

class ListItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

适应适配器

打开 listitemsrecyclerviewadapter.kt..

override fun getItemCount(): Int {
  return list.tasks.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListItemViewHolder {

  val view = LayoutInflater.from(parent.context)
             .inflate(R.layout.task_view_holder, parent, false)
  return ListItemViewHolder(view)
}

可视化视为

您现在对视图的布局,接下来,您需要在代码中的布局中引用TextView。

val taskTextView = itemView.findViewById(R.id.textview_task)
    as TextView
override fun onBindViewHolder(holder: ListItemViewHolder, position: Int) {
  holder.taskTextView.text = list.tasks[position]
}

lateinit var addTaskButton: FloatingActionButton
addTaskButton = findViewById(R.id.add_task_button)
addTaskButton.setOnClickListener {
  showCreateTaskDialog()
}
private fun showCreateTaskDialog() {
  //1
  val taskEditText = EditText(this)
  taskEditText.inputType = InputType.TYPE_CLASS_TEXT

  //2
  AlertDialog.Builder(this)
          .setTitle(R.string.task_to_add)
          .setView(taskEditText)
          .setPositiveButton(R.string.add_task) { dialog, _ ->
            // 3
            val task = taskEditText.text.toString()
            list.tasks.add(task)
            // 4
            val recyclerAdapter = listItemsRecyclerView.adapter as ListItemsRecyclerViewAdapter
            recyclerAdapter.notifyItemInserted(list.tasks.size-1)
            //5
            dialog.dismiss()
          }
          //6
          .create()
          .show()
}
<string name="task_to_add">What is the task you want to add?</string>
<string name="add_task">Add</string>

从活动返回结果

listdatamanager. 被声明并使用 mainactivity.kt.。要使用新添加的任务保存列表,请 可以 还宣布它 listdetailactivity.kt. 随时保存列表,用户添加新任务。

private fun showListDetail(list: TaskList) {
  val listDetailIntent = Intent(this, ListDetailActivity::class.java)
  listDetailIntent.putExtra(INTENT_LIST_KEY, list)

  startActivityForResult(listDetailIntent, LIST_DETAIL_REQUEST_CODE)
}

companion object {
  const val INTENT_LIST_KEY = "list"
  const val LIST_DETAIL_REQUEST_CODE = 123
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data:
    Intent?) {
  super.onActivityResult(requestCode, resultCode, data)
  // 1
  if (requestCode == LIST_DETAIL_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
    // 2
    data?.let {
      // 3
      listDataManager.saveList(data.getParcelableExtra(INTENT_LIST_KEY) as TaskList)
      updateLists()
    }
  }
}
private fun updateLists() {
  val lists = listDataManager.readLists()
  listsRecyclerView.adapter =
      ListSelectionRecyclerViewAdapter(lists, this)
}
override fun onBackPressed() {
  val bundle = Bundle()
  bundle.putParcelable(MainActivity.INTENT_LIST_KEY, list)

  val intent = Intent()
  intent.putExtras(bundle)
  setResult(Activity.RESULT_OK, intent)
  super.onBackPressed()
}

然后去哪儿?

您在本章中重新使用了很多知识,并以清洁的方式挑选了新技巧,以便以干净的方式重用应用程序中的代码。

有一个技术问题?想报告一个错误吗? 您可以向官方书籍论坛中的书籍作者提出问题和报告错误 这里 .

有反馈分享在线阅读体验吗? 如果您对UI,UX,高亮反馈,或者我们的在线读者的其他功能,您可以付款给设计团队与下面的表格:

© 2021 Razeware LLC

您可以免费读取,本章的部分显示为 混淆了 文本。解锁这本书,以及我们整个书籍和视频目录,带有Raywenderlich.com的专业订阅。

现在解锁

要突出或记笔记,您需要在订阅中拥有这本书或自行购买。