Last active
December 13, 2018 08:18
-
-
Save Atsumi3/e212a1b6a32c087c36b32b0717a1bea7 to your computer and use it in GitHub Desktop.
カスタムビューの表示や動作チェックに使えるかも
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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