kotlin / android: установите каждую кнопку в обзоре переработчика, чтобы начать свою собственную деятельность - PullRequest
0 голосов
/ 05 января 2019

Я хочу выполнить задание по выбору уровня в игре. Для этого я создал обзор переработчика с кнопками. Каждая из этих кнопок должна начать свой соответствующий уровень. С помощью приведенного ниже кода (взятого из адаптера) все они просто указывают на MainActivity. Есть ли простой способ изменить это?

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.levelButton?.text = items.get(position)
        holder.itemView.levelButton.setOnClickListener{
            var gotoLevel= Intent(context,MainActivity::class.java)
            context.startActivity(gotoLevel)
    }
}

Мои извинения, если это слишком очевидно, я спрашиваю. Я начал кодировать всего пару дней назад и все еще нахожусь в той фазе, когда вы даже не знаете подходящих условий поиска Google для ваших проблем.

Ответы [ 3 ]

0 голосов
/ 04 августа 2019

Вы должны получить контекст из суперкласса ( RecyclerView.Adapter ). И используйте его, чтобы создать Intent из setOnClickListener метод вашего View

class YourHolder(view: View) : RecyclerView.ViewHolder(view) {
    private var buttonView = view.buttonView
    // Variable for the Context
    private lateinit var context : Context
    fun bindHolder(itemData: ItemData) {
        // Init context
        context = super.itemView.context
        // OnClick Button Handler
        buttonView .setOnClickListener{
            // Move to AnotherActivity
            val intent = Intent(this.context, AnotherActivity::class.java)
            intent.putExtra("key", ItemData.value)
            startActivity(this.context, intent, null)
        }
    }
}
0 голосов
/ 04 августа 2019

Самое простое, что нужно сделать, это обновить модель данных, включив в нее класс действия, которое вы хотите запустить. Прямо сейчас, похоже, у вас просто есть список строк. Поэтому измените его на пользовательский объект со строкой и классом, который вы хотите запустить.

class Item(val levelButtonText: String, val activityClass: Class<*>)

Тогда ваша привязка заменяет жестко закодированный MainActivity :: class.java текущим классом элементов:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val item = items.get(position)
    holder.levelButton?.text = item.levelButtonText
    holder.itemView.levelButton.setOnClickListener{
        var gotoLevel= Intent(context, item.activityClass)
        context.startActivity(gotoLevel)
}

Затем, где бы вы ни создавали свой список элементов для адаптера, вы заменяете одну строку на Item, которая устанавливает класс действия, которое вы хотите запустить.

Надеюсь, это поможет!

0 голосов
/ 06 января 2019

У вас есть разные варианты для достижения этой цели - в идеале у нас отключена логика от адаптера, и ваша деятельность должна быть связана с действиями, которые нужно выполнить после того, как пользователь нажмет одну из строк.

Насколько я могу судить, вы определили ViewHolder , который должен ссылаться на ваши представления - верно? Вы можете добавить интерфейс клика элемента так:

class ViewHolder(view : View) : RecyclerView.ViewHolder(view) {

    val levelButton : TextView = view.tv_levelButton

    interface OnUserAction {

        fun onItemClick(item : Item)
    }
}

и для того, чтобы запускать его каждый раз, когда пользователь щелкает ячейку - вместо того, чтобы устанавливать его при каждом обновлении представления, вы должны делать это только один раз для onCreateViewHolder :

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val inflater = LayoutInflater.from(parent.context)
    val holder = ViewHolder(inflater.inflate(R.layout.your_layout, parent, false))

    holder.onClick {
        position, _ -> action.onItemClick(items.get(position))
    }

    return holder
}

Это действие поле, которое вы видите выше, это интерфейс, отправленный конструктору адаптера:

class ItemsAdapter(val items: List<Item>, private val action: ViewHolder.OnUserAction)...

При этом для вызова определенного действия в вашей деятельности / фрагменте вам просто нужно реализовать созданный интерфейс - OnUserAction :

override fun onItemClick(item: Item) {
    var gotoLevel = getLevel(item)
    context.startActivity(gotoLevel)
}

Edit: Чтобы упростить задачу, я создал функцию расширения OnClick:

fun <T : RecyclerView.ViewHolder> T.onClick(event: (position: Int, type: Int) -> Unit): T {
itemView.setOnClickListener {
    event.invoke(adapterPosition, itemViewType)
}
return this

}

...