Procházet zdrojové kódy

Added abstract books adapter with headers

Vadik Sirekanyan před 7 roky
rodič
revize
996b0fe3eb

+ 17 - 17
app/src/main/java/me/vadik/knigopis/adapters/books/BooksAdapter.kt

@@ -1,32 +1,31 @@
 package me.vadik.knigopis.adapters.books
 
-import android.support.v7.widget.RecyclerView
-import android.view.ViewGroup
 import me.vadik.knigopis.R
+import me.vadik.knigopis.common.adapter.AbstractBooksAdapter
+import me.vadik.knigopis.common.adapter.BookHeaderViewHolder
+import me.vadik.knigopis.common.adapter.BookItemViewHolder
 import me.vadik.knigopis.createNewBookIntent
 import me.vadik.knigopis.dialog.DialogFactory
 import me.vadik.knigopis.dialog.createDialogItem
-import me.vadik.knigopis.inflate
+import me.vadik.knigopis.model.Book
+import me.vadik.knigopis.model.BookHeader
 import me.vadik.knigopis.model.FinishedBook
 
 class BooksAdapter(
-    private val books: List<FinishedBook>,
+    books: List<Book>,
     private val dialogs: DialogFactory
-) : RecyclerView.Adapter<BookViewHolder>() {
+) : AbstractBooksAdapter(books, R.layout.header, R.layout.user_book) {
 
-    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
-        BookViewHolder(parent.inflate(R.layout.user_book))
-
-    override fun getItemCount() =
-        books.size
+    override fun bindHeaderViewHolder(holder: BookHeaderViewHolder, header: BookHeader) {
+        holder.setTitle(header.title)
+    }
 
-    override fun onBindViewHolder(holder: BookViewHolder, position: Int) {
-        val book = books[position]
-        holder.title = book.title
-        holder.author = book.author
-        holder.notes = book.notes
-        val context = holder.view.context
-        holder.view.setOnLongClickListener {
+    override fun bindItemViewHolder(holder: BookItemViewHolder, book: FinishedBook) {
+        holder.setTitle(book.title)
+        holder.setAuthor(book.author)
+        holder.setNotes(book.notes)
+        holder.setOnLongClick { view ->
+            val context = view.context
             dialogs.showDialog(
                 book.title + " — " + book.author,
                 createDialogItem(R.string.user_button_todo, R.drawable.ic_playlist_add) {
@@ -39,4 +38,5 @@ class BooksAdapter(
             true
         }
     }
+
 }

+ 49 - 0
app/src/main/java/me/vadik/knigopis/common/adapter/AbstractBooksAdapter.kt

@@ -0,0 +1,49 @@
+package me.vadik.knigopis.common.adapter
+
+import android.support.annotation.LayoutRes
+import android.support.v7.widget.RecyclerView
+import android.view.ViewGroup
+import me.vadik.knigopis.inflate
+import me.vadik.knigopis.model.Book
+import me.vadik.knigopis.model.BookHeader
+import me.vadik.knigopis.model.FinishedBook
+
+private const val HEADER_TYPE = 0
+private const val ITEM_TYPE = 1
+
+abstract class AbstractBooksAdapter(
+    private val elements: List<Book>,
+    @LayoutRes private val headerLayout: Int,
+    @LayoutRes private val itemLayout: Int
+) : RecyclerView.Adapter<BookViewHolder>() {
+
+    abstract fun bindHeaderViewHolder(holder: BookHeaderViewHolder, header: BookHeader)
+
+    abstract fun bindItemViewHolder(holder: BookItemViewHolder, book: FinishedBook)
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
+        if (viewType == HEADER_TYPE) {
+            BookHeaderViewHolder(parent.inflate(headerLayout))
+        } else {
+            BookItemViewHolder(parent.inflate(itemLayout))
+        }
+
+    override fun onBindViewHolder(holder: BookViewHolder, position: Int) {
+        val element = elements[position]
+        when (holder) {
+            is BookHeaderViewHolder -> bindHeaderViewHolder(holder, element as BookHeader)
+            is BookItemViewHolder -> bindItemViewHolder(holder, element as FinishedBook)
+        }
+    }
+
+    override fun getItemCount() =
+        elements.size
+
+    override fun getItemViewType(position: Int) =
+        if (elements[position] is BookHeader) {
+            HEADER_TYPE
+        } else {
+            ITEM_TYPE
+        }
+
+}

+ 38 - 0
app/src/main/java/me/vadik/knigopis/common/adapter/BookViewHolder.kt

@@ -0,0 +1,38 @@
+package me.vadik.knigopis.common.adapter
+
+import android.support.v7.widget.RecyclerView
+import android.view.View
+import kotlinx.android.synthetic.main.header.view.*
+import kotlinx.android.synthetic.main.user_book.view.*
+import me.vadik.knigopis.showNow
+
+sealed class BookViewHolder(view: View) : RecyclerView.ViewHolder(view)
+
+class BookHeaderViewHolder(private val view: View) : BookViewHolder(view) {
+
+    fun setTitle(title: String) {
+        view.book_title.text = title
+    }
+
+}
+
+class BookItemViewHolder(private val view: View) : BookViewHolder(view) {
+
+    fun setTitle(title: String) {
+        view.bookTitle.text = title
+    }
+
+    fun setAuthor(author: String) {
+        view.bookAuthor.text = author
+    }
+
+    fun setNotes(notes: String) {
+        view.bookNotes.showNow(notes.isNotEmpty())
+        view.bookNotes.text = notes
+    }
+
+    fun setOnLongClick(onLongClick: (View) -> Boolean) {
+        view.setOnLongClickListener(onLongClick)
+    }
+
+}

+ 2 - 2
app/src/main/java/me/vadik/knigopis/user/UserActivity.kt

@@ -14,7 +14,7 @@ import me.vadik.knigopis.*
 import me.vadik.knigopis.adapters.books.BooksAdapter
 import me.vadik.knigopis.common.setCircleImage
 import me.vadik.knigopis.dialog.DialogFactory
-import me.vadik.knigopis.model.FinishedBook
+import me.vadik.knigopis.model.Book
 import me.vadik.knigopis.utils.systemClipboardManager
 import org.koin.android.ext.android.inject
 
@@ -33,7 +33,7 @@ class UserActivity : AppCompatActivity() {
     private val interactor by inject<UserInteractor>()
     private val dialogs by inject<DialogFactory> { mapOf("activity" to this) }
     private val userId by lazy { intent.getStringExtra(EXTRA_USER_ID) }
-    private val books = mutableListOf<FinishedBook>()
+    private val books = mutableListOf<Book>()
     private val booksAdapter = BooksAdapter(books, dialogs)
     private lateinit var unsubscribeOption: MenuItem
 

+ 4 - 3
app/src/main/java/me/vadik/knigopis/user/UserInteractor.kt

@@ -5,7 +5,7 @@ import io.reactivex.Single
 import me.vadik.knigopis.api.Endpoint
 import me.vadik.knigopis.auth.KAuth
 import me.vadik.knigopis.io2main
-import me.vadik.knigopis.model.FinishedBook
+import me.vadik.knigopis.model.Book
 
 interface UserInteractor {
 
@@ -15,7 +15,7 @@ interface UserInteractor {
 
     fun isSubscribed(userId: String): Single<Boolean>
 
-    fun getBooks(userId: String): Single<List<FinishedBook>>
+    fun getBooks(userId: String): Single<List<Book>>
 
 }
 
@@ -40,8 +40,9 @@ class UserInteractorImpl(
             .map { subscriptions -> subscriptions.any { it.subUser.id == userId } }
             .io2main()
 
-    override fun getBooks(userId: String) =
+    override fun getBooks(userId: String): Single<List<Book>> =
         api.getUserBooks(userId)
+            .map { it as List<Book> }
             .io2main()
 
 }