Skip to content

Instantly share code, notes, and snippets.

@Atsumi3
Last active December 13, 2018 08:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Atsumi3/e212a1b6a32c087c36b32b0717a1bea7 to your computer and use it in GitHub Desktop.
Save Atsumi3/e212a1b6a32c087c36b32b0717a1bea7 to your computer and use it in GitHub Desktop.
カスタムビューの表示や動作チェックに使えるかも
// usage
val adapter = ViewListAdapter(listOf(TextView::class, ImageView::class, Button::class)).apply {
listener = object : ViewListAdapter.Listener {
override fun onViewSelect(selectedViewInstance: View?) {
when(selectedViewInstance) {
is TextView -> selectedViewInstance.text = "textView"
is ImageView -> selectedViewInstance.setImageResource(android.R.drawable.ic_input_add)
is Button -> selectedViewInstance.text = "button"
}
}
}
}
// extension
fun KClass<out View>.get(context: Context): View? = primaryConstructor?.call(context).run {
var instance: View? = null
constructors.forEach { it ->
when (it.parameters.size) {
1 -> instance = it.call(context)
2 -> instance = it.call(context, null)
3 -> instance = it.call(context, null, 0)
4 -> instance = it.call(context, null, 0, 0)
}
if (instance != null) return@forEach
}
return instance
}
class ViewListAdapter(private val views: List<KClass<out View>>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
var listener: Listener? = null
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val view = LayoutInflater.from(viewGroup.context).inflate(R.layout.item_view_list_content, viewGroup, false)
return ItemListContentViewHolder(view, object : ItemListContentViewHolder.Listener {
override fun onItemClick(viewClass: KClass<out View>) {
listener?.onViewSelect(viewClass.get(viewGroup.context))
}
})
}
override fun getItemCount() = views.size
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
(holder as ItemListContentViewHolder).setData(views[position])
}
interface Listener {
fun onViewSelect(selectedViewInstance: View?)
}
class ItemListContentViewHolder(view: View, private val listener: Listener) : RecyclerView.ViewHolder(view) {
private val textView: TextView = view.findViewById(R.id.text)
fun setData(viewClass: KClass<out View>) {
textView.text = viewClass.simpleName
itemView.setOnClickListener { listener.onItemClick(viewClass) }
}
interface Listener {
fun onItemClick(viewClass: KClass<out View>)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment