瀏覽代碼

Refactoring: added extension for adapter

sirekanyan 8 年之前
父節點
當前提交
e28785b5c4

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

@@ -31,9 +31,9 @@ class MainActivity : AppCompatActivity() {
   private val users = mutableListOf<User>()
   private val books = mutableListOf<Book>()
   private val wishes = mutableListOf<Wish>()
-  private val usersAdapter = UsersAdapter(users)
-  private val booksAdapter = BooksAdapter(books)
-  private val wishesAdapter = WishesAdapter(wishes)
+  private val usersAdapter = UsersAdapter.create(users)
+  private val booksAdapter = BooksAdapter.create(books)
+  private val wishesAdapter = WishesAdapter.create(wishes)
   private lateinit var usersRecyclerView: RecyclerView
   private lateinit var booksRecyclerView: RecyclerView
   private lateinit var wishesRecyclerView: RecyclerView

+ 8 - 24
app/src/main/java/me/vadik/knigopis/adapters/BooksAdapter.kt

@@ -1,31 +1,15 @@
 package me.vadik.knigopis.adapters
 
-import android.support.v7.widget.RecyclerView
-import android.view.View
-import me.vadik.knigopis.adapters.BooksAdapter.BookViewHolder
-import android.view.ViewGroup
 import android.widget.TextView
 import me.vadik.knigopis.R
-import me.vadik.knigopis.inflate
 import me.vadik.knigopis.model.Book
 
-class BooksAdapter(private val books: List<Book>) : RecyclerView.Adapter<BookViewHolder>() {
-
-  class BookViewHolder(rootView: View) : RecyclerView.ViewHolder(rootView) {
-    val title: TextView = rootView.findViewById(R.id.book_title)
-    val author: TextView = rootView.findViewById(R.id.book_author)
-    val date: TextView = rootView.findViewById(R.id.book_read_date)
-  }
-
-  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
-      BookViewHolder(parent.inflate(R.layout.book))
-
-  override fun onBindViewHolder(holder: BookViewHolder, position: Int) {
-    val book = books[position]
-    holder.title.text = book.title
-    holder.author.text = book.author
-    holder.date.text = book.createdAt
-  }
-
-  override fun getItemCount() = books.size
+object BooksAdapter {
+  fun create(books: List<Book>) = createAdapter<Book, TextView>(
+      books,
+      R.layout.book,
+      Adapter(R.id.book_title) { text = it.title },
+      Adapter(R.id.book_author) { text = it.author },
+      Adapter(R.id.book_read_date) { text = it.createdAt }
+  )
 }

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

@@ -1,30 +1,17 @@
 package me.vadik.knigopis.adapters
 
-import android.support.v7.widget.RecyclerView
-import android.view.View
-import android.view.ViewGroup
 import android.widget.TextView
 import me.vadik.knigopis.R
-import me.vadik.knigopis.adapters.UsersAdapter.UserViewHolder
-import me.vadik.knigopis.inflate
 import me.vadik.knigopis.model.User
 
-class UsersAdapter(private val users: List<User>) : RecyclerView.Adapter<UserViewHolder>() {
-
-  class UserViewHolder(rootView: View) : RecyclerView.ViewHolder(rootView) {
-    val userName: TextView = rootView.findViewById(R.id.user_name)
-    val bookCount: TextView = rootView.findViewById(R.id.book_count)
-  }
-
-  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
-      UserViewHolder(parent.inflate(R.layout.user))
-
-  override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
-    val user = users[position]
-    holder.userName.text = user.nickname
-    holder.bookCount.text = user.booksCount.toString()
-    holder.bookCount.setTextColor(user.color)
-  }
-
-  override fun getItemCount() = users.size
+object UsersAdapter {
+  fun create(users: List<User>) = createAdapter<User, TextView>(
+      users,
+      R.layout.user,
+      Adapter(R.id.user_name) { text = it.nickname },
+      Adapter(R.id.book_count) {
+        text = it.booksCount.toString()
+        setTextColor(it.color)
+      }
+  )
 }

+ 8 - 24
app/src/main/java/me/vadik/knigopis/adapters/WishesAdapter.kt

@@ -1,31 +1,15 @@
 package me.vadik.knigopis.adapters
 
-import android.support.v7.widget.RecyclerView
-import android.view.View
-import android.view.ViewGroup
 import android.widget.TextView
 import me.vadik.knigopis.R
-import me.vadik.knigopis.adapters.WishesAdapter.WishViewHolder
-import me.vadik.knigopis.inflate
 import me.vadik.knigopis.model.Wish
 
-class WishesAdapter(private val wishes: List<Wish>) : RecyclerView.Adapter<WishViewHolder>() {
-
-  class WishViewHolder(rootView: View) : RecyclerView.ViewHolder(rootView) {
-    val title: TextView = rootView.findViewById(R.id.book_title)
-    val author: TextView = rootView.findViewById(R.id.book_author)
-    val date: TextView = rootView.findViewById(R.id.book_read_date)
-  }
-
-  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
-      WishViewHolder(parent.inflate(R.layout.book))
-
-  override fun onBindViewHolder(holder: WishViewHolder, position: Int) {
-    val wish = wishes[position]
-    holder.title.text = wish.title
-    holder.author.text = wish.author
-    holder.date.text = wish.priority.toString()
-  }
-
-  override fun getItemCount() = wishes.size
+object WishesAdapter {
+  fun create(wishes: List<Wish>) = createAdapter<Wish, TextView>(
+      wishes,
+      R.layout.book,
+      Adapter(R.id.book_title) { text = it.title },
+      Adapter(R.id.book_author) { text = it.author },
+      Adapter(R.id.book_read_date) { text = it.createdAt }
+  )
 }

+ 35 - 0
app/src/main/java/me/vadik/knigopis/adapters/adapter.kt

@@ -0,0 +1,35 @@
+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
+import me.vadik.knigopis.inflate
+
+class Adapter<in T, in V : View>(@IdRes val id: Int, val bind: V.(T) -> Unit)
+
+class ViewHolder(rootView: View, val views: List<*>) : RecyclerView.ViewHolder(rootView)
+
+fun <T, V : View> createAdapter(
+    items: List<T>,
+    @LayoutRes itemLayout: Int,
+    vararg adapters: Adapter<T, V>
+) =
+    object : RecyclerView.Adapter<ViewHolder>() {
+      override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
+          parent.inflate(itemLayout).let { rootView ->
+            ViewHolder(rootView, adapters.map {
+              @Suppress("UNCHECKED_CAST")
+              rootView.findViewById<View>(it.id) as V
+            })
+          }
+
+      override fun onBindViewHolder(holder: ViewHolder, position: Int) =
+          adapters.forEachIndexed { index, adapter ->
+            @Suppress("UNCHECKED_CAST")
+            adapter.bind.invoke(holder.views[index] as V, items[position])
+          }
+
+      override fun getItemCount() = items.size
+    }