Explorar o código

Added subheaders to recycler view adapter

sirekanyan %!s(int64=8) %!d(string=hai) anos
pai
achega
5a48742399

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

@@ -123,10 +123,10 @@ class MainActivity : AppCompatActivity() {
     booksRecyclerView.adapter = allBooksAdapter
     allBooks.clear()
     Single.concat(
-        Single.just(listOf(FinishedBook("", "К прочтению", "", "", "", "", "", "", User("", "", 0, "")))),
+        Single.just(listOf(BookHeader("К прочтению"))),
         api.getPlannedBooks(auth.getAccessToken())
             .map { it.sortedByDescending { it.priority } },
-        Single.just(listOf(FinishedBook("", "Прочитано", "", "", "", "", "", "", User("", "", 0, "")))),
+        Single.just(listOf(BookHeader("Прочитано"))),
         api.getFinishedBooks(auth.getAccessToken())
             .map { it.sortedByDescending(FinishedBook::order) }
     ).io2main()

+ 4 - 3
app/src/main/java/me/vadik/knigopis/adapters/Adapter.kt

@@ -1,7 +1,6 @@
 package me.vadik.knigopis.adapters
 
 import android.support.annotation.IdRes
-import android.support.annotation.LayoutRes
 import android.support.v7.widget.RecyclerView
 import android.view.View
 import android.view.ViewGroup
@@ -9,7 +8,7 @@ import me.vadik.knigopis.inflate
 
 class Adapter<T>(
     private val items: List<T>,
-    @LayoutRes private val itemLayout: Int
+    private val layout: (T) -> Int
 ) {
 
   val binders = mutableMapOf<@IdRes Int, (View, T) -> Unit>()
@@ -23,7 +22,7 @@ class Adapter<T>(
 
   fun build() = object : RecyclerView.Adapter<ViewsHolder>() {
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
-        parent.inflate(itemLayout).let { rootView ->
+        parent.inflate(viewType).let { rootView ->
           ViewsHolder(rootView, binders.mapValues { (key, _) ->
             rootView.findViewById<View>(key)
           })
@@ -37,6 +36,8 @@ class Adapter<T>(
         }
 
     override fun getItemCount() = items.size
+
+    override fun getItemViewType(position: Int) = layout(items[position])
   }
 }
 

+ 11 - 4
app/src/main/java/me/vadik/knigopis/adapters/BooksAdapter.kt

@@ -10,12 +10,19 @@ import me.vadik.knigopis.api.BookCoverSearch
 import me.vadik.knigopis.R
 import me.vadik.knigopis.logError
 import me.vadik.knigopis.model.Book
+import me.vadik.knigopis.model.BookHeader
 import me.vadik.knigopis.model.FinishedBook
 import me.vadik.knigopis.model.PlannedBook
 
 class BooksAdapter(private val coverSearch: BookCoverSearch) {
 
-  fun build(books: List<Book>) = Adapter(books, R.layout.book)
+  fun build(books: List<Book>) = Adapter(books) {
+    if (it is BookHeader) {
+      R.layout.header
+    } else {
+      R.layout.book
+    }
+  }
       .bind<ImageView>(R.id.book_image) { book ->
         coverSearch.search(book)
             .subscribe({ coverUrl ->
@@ -50,12 +57,12 @@ class BooksAdapter(private val coverSearch: BookCoverSearch) {
         }
       }
       .bind<CheckBox>(R.id.book_read_checkbox) {
-        when (it) {
+        visibility = when (it) {
           is FinishedBook -> {
-            visibility = View.GONE
+            View.GONE
           }
           is PlannedBook -> {
-            visibility = View.VISIBLE
+            View.VISIBLE
           }
           else -> TODO()
         }

+ 1 - 1
app/src/main/java/me/vadik/knigopis/adapters/UsersAdapter.kt

@@ -5,7 +5,7 @@ import me.vadik.knigopis.R
 import me.vadik.knigopis.model.User
 
 object UsersAdapter {
-  fun create(users: List<User>) = Adapter(users, R.layout.user)
+  fun create(users: List<User>) = Adapter(users, { R.layout.user })
       .bind<TextView>(R.id.user_name) {
         text = it.nickname
       }

+ 1 - 1
app/src/main/java/me/vadik/knigopis/api/BookCoverSearch.kt

@@ -8,7 +8,7 @@ import java.util.concurrent.TimeUnit
 
 private const val PREFERENCE_PREFIX = "thumbnail_"
 private const val MAX_DELAY_IN_MICROSECONDS = 3000
-private const val MIN_TITLE_WORDS_COUNT = 1
+private const val MIN_TITLE_WORDS_COUNT = 2
 
 interface BookCoverSearch {
   fun search(book: Book): Single<String>

+ 7 - 0
app/src/main/java/me/vadik/knigopis/model/BookHeader.kt

@@ -0,0 +1,7 @@
+package me.vadik.knigopis.model
+
+class BookHeader(
+    override val title: String,
+    override val id: String = "",
+    override val author: String = ""
+) : Book

+ 14 - 0
app/src/main/res/layout/header.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/book_title"
+    android:layout_width="match_parent"
+    android:layout_height="48dp"
+    android:fontFamily="sans-serif-medium"
+    android:gravity="center_vertical"
+    android:paddingEnd="16dp"
+    android:paddingStart="16dp"
+    android:textColor="@color/black_54"
+    android:textSize="14sp"
+    tools:text="К прочтению"/>

+ 1 - 0
app/src/main/res/values/colors.xml

@@ -4,4 +4,5 @@
     <color name="colorPrimaryDark">#303F9F</color>
     <color name="colorAccent">#FF4081</color>
     <color name="white">#FFFFFF</color>
+    <color name="black_54">#757575</color>
 </resources>