Use recycler view in homework details dialog (#761)

This commit is contained in:
Mikołaj Pich 2020-04-08 18:17:20 +02:00 committed by GitHub
parent a26f0ec8c8
commit 0a18fefb1f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 260 additions and 150 deletions

View File

@ -0,0 +1,84 @@
package io.github.wulkanowy.ui.modules.homework.details
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import io.github.wulkanowy.R
import io.github.wulkanowy.data.db.entities.Homework
import io.github.wulkanowy.utils.toFormattedString
import kotlinx.android.synthetic.main.item_homework_dialog_attachment.view.*
import kotlinx.android.synthetic.main.item_homework_dialog_details.view.*
import javax.inject.Inject
class HomeworkDetailsAdapter @Inject constructor() :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private enum class ViewType(val id: Int) {
DETAILS(1),
ATTACHMENTS_HEADER(2),
ATTACHMENT(3)
}
private var attachments = emptyList<Pair<String, String>>()
var homework: Homework? = null
set(value) {
field = value
attachments = value?.attachments.orEmpty()
}
var onAttachmentClickListener: (url: String) -> Unit = {}
override fun getItemCount() = 1 + if (attachments.isNotEmpty()) attachments.size + 1 else 0
override fun getItemViewType(position: Int) = when (position) {
0 -> ViewType.DETAILS.id
1 -> ViewType.ATTACHMENTS_HEADER.id
else -> ViewType.ATTACHMENT.id
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(parent.context)
return when (viewType) {
ViewType.ATTACHMENTS_HEADER.id -> AttachmentsHeaderViewHolder(inflater.inflate(R.layout.item_homework_dialog_attachments_header, parent, false))
ViewType.ATTACHMENT.id -> AttachmentViewHolder(inflater.inflate(R.layout.item_homework_dialog_attachment, parent, false))
else -> DetailsViewHolder(inflater.inflate(R.layout.item_homework_dialog_details, parent, false))
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is DetailsViewHolder -> bindDetailsViewHolder(holder)
is AttachmentViewHolder -> bindAttachmentViewHolder(holder, position - 2)
}
}
private fun bindDetailsViewHolder(holder: DetailsViewHolder) {
with(holder.view) {
homeworkDialogDate.text = homework?.date?.toFormattedString()
homeworkDialogEntryDate.text = homework?.entryDate?.toFormattedString()
homeworkDialogSubject.text = homework?.subject
homeworkDialogTeacher.text = homework?.teacher
homeworkDialogContent.text = homework?.content
}
}
private fun bindAttachmentViewHolder(holder: AttachmentViewHolder, position: Int) {
val item = attachments[position]
with(holder.view) {
homeworkDialogAttachment.text = item.second
setOnClickListener {
onAttachmentClickListener(item.first)
}
}
}
class DetailsViewHolder(val view: View) : RecyclerView.ViewHolder(view)
class AttachmentsHeaderViewHolder(val view: View) : RecyclerView.ViewHolder(view)
class AttachmentViewHolder(val view: View) : RecyclerView.ViewHolder(view)
}

View File

@ -2,16 +2,15 @@ package io.github.wulkanowy.ui.modules.homework.details
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.os.Bundle import android.os.Bundle
import android.text.method.LinkMovementMethod
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.text.HtmlCompat import androidx.recyclerview.widget.LinearLayoutManager
import io.github.wulkanowy.R import io.github.wulkanowy.R
import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.db.entities.Homework
import io.github.wulkanowy.ui.base.BaseDialogFragment import io.github.wulkanowy.ui.base.BaseDialogFragment
import io.github.wulkanowy.ui.modules.homework.HomeworkFragment import io.github.wulkanowy.ui.modules.homework.HomeworkFragment
import io.github.wulkanowy.utils.toFormattedString import io.github.wulkanowy.utils.openInternetBrowser
import kotlinx.android.synthetic.main.dialog_homework.* import kotlinx.android.synthetic.main.dialog_homework.*
import javax.inject.Inject import javax.inject.Inject
@ -20,6 +19,9 @@ class HomeworkDetailsDialog : BaseDialogFragment(), HomeworkDetailsView {
@Inject @Inject
lateinit var presenter: HomeworkDetailsPresenter lateinit var presenter: HomeworkDetailsPresenter
@Inject
lateinit var detailsAdapter: HomeworkDetailsAdapter
private lateinit var homework: Homework private lateinit var homework: Homework
companion object { companion object {
@ -51,20 +53,17 @@ class HomeworkDetailsDialog : BaseDialogFragment(), HomeworkDetailsView {
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun initView() { override fun initView() {
homeworkDialogDate.text = homework.date.toFormattedString()
homeworkDialogEntryDate.text = homework.entryDate.toFormattedString()
homeworkDialogSubject.text = homework.subject
homeworkDialogTeacher.text = homework.teacher
homeworkDialogContent.movementMethod = LinkMovementMethod.getInstance()
homeworkDialogContent.text = homework.content
homeworkDialogAttachments.movementMethod = LinkMovementMethod.getInstance()
homeworkDialogAttachments.text = HtmlCompat.fromHtml(homework.attachments.joinToString("<br>") {
"<a href='${it.first}'>${it.second}</a>"
}, HtmlCompat.FROM_HTML_MODE_COMPACT).ifBlank { getString(R.string.all_no_data) }
homeworkDialogRead.text = view?.context?.getString(if (homework.isDone) R.string.homework_mark_as_undone else R.string.homework_mark_as_done) homeworkDialogRead.text = view?.context?.getString(if (homework.isDone) R.string.homework_mark_as_undone else R.string.homework_mark_as_done)
homeworkDialogRead.setOnClickListener { presenter.toggleDone(homework) } homeworkDialogRead.setOnClickListener { presenter.toggleDone(homework) }
homeworkDialogClose.setOnClickListener { dismiss() } homeworkDialogClose.setOnClickListener { dismiss() }
with(homeworkDialogRecycler) {
layoutManager = LinearLayoutManager(context)
adapter = detailsAdapter.apply {
onAttachmentClickListener = { context.openInternetBrowser(it, ::showMessage) }
homework = this@HomeworkDetailsDialog.homework
}
}
} }
override fun updateMarkAsDoneLabel(isDone: Boolean) { override fun updateMarkAsDoneLabel(isDone: Boolean) {

View File

@ -1,143 +1,39 @@
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/parent"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<LinearLayout <androidx.recyclerview.widget.RecyclerView
android:layout_width="300dp" android:id="@+id/homeworkDialogRecycler"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:layout_above="@+id/homeworkDialogClose"
android:padding="20dp"> android:layout_alignParentTop="true"
tools:itemCount="1"
tools:listitem="@layout/item_homework_dialog_details" />
<TextView <com.google.android.material.button.MaterialButton
android:layout_width="wrap_content" android:id="@+id/homeworkDialogRead"
android:layout_height="wrap_content" style="@style/Widget.MaterialComponents.Button.TextButton"
android:layout_marginTop="20dp" android:layout_width="wrap_content"
android:layout_marginBottom="20dp" android:layout_height="wrap_content"
android:text="@string/all_details" android:layout_alignParentStart="true"
android:textSize="20sp" /> android:layout_alignParentBottom="true"
android:layout_marginStart="10dp"
android:layout_marginBottom="10dp"
android:text="@string/homework_mark_as_done" />
<TextView <com.google.android.material.button.MaterialButton
android:layout_width="wrap_content" android:id="@+id/homeworkDialogClose"
android:layout_height="wrap_content" style="@style/Widget.MaterialComponents.Button.TextButton"
android:text="@string/all_subject" android:layout_width="wrap_content"
android:textSize="17sp" /> android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
<TextView android:layout_alignParentBottom="true"
android:id="@+id/homeworkDialogSubject" android:layout_marginEnd="10dp"
android:layout_width="wrap_content" android:layout_marginBottom="10dp"
android:layout_height="wrap_content" android:text="@string/all_close"
android:layout_marginTop="3dp" tools:ignore="RelativeOverlap" />
android:text="@string/all_no_data" </RelativeLayout>
android:textIsSelectable="true"
android:textSize="12sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/all_teacher"
android:textSize="17sp" />
<TextView
android:id="@+id/homeworkDialogTeacher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="@string/all_no_data"
android:textIsSelectable="true"
android:textSize="12sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/all_date"
android:textSize="17sp" />
<TextView
android:id="@+id/homeworkDialogDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="@string/all_no_data"
android:textIsSelectable="true"
android:textSize="12sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/all_entry_date"
android:textSize="17sp" />
<TextView
android:id="@+id/homeworkDialogEntryDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="@string/all_no_data"
android:textIsSelectable="true"
android:textSize="12sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/all_content"
android:textSize="17sp" />
<TextView
android:id="@+id/homeworkDialogContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:lineSpacingMultiplier="1.2"
android:text="@string/all_no_data"
android:textIsSelectable="true"
android:textSize="12sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/homework_attachments"
android:textSize="17sp" />
<TextView
android:id="@+id/homeworkDialogAttachments"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:lineSpacingMultiplier="1.2"
android:text="@string/all_no_data"
android:textIsSelectable="true"
android:textSize="14sp" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp">
<com.google.android.material.button.MaterialButton
android:id="@+id/homeworkDialogRead"
style="@style/Widget.MaterialComponents.Button.TextButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/homework_mark_as_done"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.button.MaterialButton
android:id="@+id/homeworkDialogClose"
style="@style/Widget.MaterialComponents.Button.TextButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="1dp"
android:text="@string/all_close"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@ -0,0 +1,21 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackground"
android:paddingStart="20dp"
android:paddingTop="3dp"
android:paddingEnd="10dp"
android:paddingBottom="3dp">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/homeworkDialogAttachment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="10dp"
android:textSize="12sp"
app:drawableStartCompat="@drawable/ic_attachment"
app:drawableTint="?colorOnBackground"
tools:text="@tools:sample/lorem" />
</LinearLayout>

View File

@ -0,0 +1,14 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="20dp"
android:paddingEnd="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="3dp"
android:text="@string/homework_attachments"
android:textSize="17sp" />
</LinearLayout>

View File

@ -0,0 +1,96 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="20dp"
android:paddingTop="20dp"
android:paddingEnd="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:text="@string/all_details"
android:textSize="20sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/all_subject"
android:textSize="17sp" />
<TextView
android:id="@+id/homeworkDialogSubject"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="@string/all_no_data"
android:textIsSelectable="true"
android:textSize="12sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/all_teacher"
android:textSize="17sp" />
<TextView
android:id="@+id/homeworkDialogTeacher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="@string/all_no_data"
android:textIsSelectable="true"
android:textSize="12sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/all_date"
android:textSize="17sp" />
<TextView
android:id="@+id/homeworkDialogDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="@string/all_no_data"
android:textIsSelectable="true"
android:textSize="12sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/all_entry_date"
android:textSize="17sp" />
<TextView
android:id="@+id/homeworkDialogEntryDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:text="@string/all_no_data"
android:textIsSelectable="true"
android:textSize="12sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/all_content"
android:textSize="17sp" />
<TextView
android:id="@+id/homeworkDialogContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:lineSpacingMultiplier="1.2"
android:text="@string/all_no_data"
android:textIsSelectable="true"
android:textSize="12sp" />
</LinearLayout>