Использование Kotlin для обновления ActionBar в Android RecyclerViewAdapter - PullRequest
0 голосов
/ 10 июля 2019

У меня есть RecyclerViewAdapter для приложения для корзины покупок, написанного на Kotlin.Когда пользователи изменяют количество товаров в своей корзине, я хотел бы обновить заголовок панели действий с текущей суммой корзины.

Я посмотрел на различный код с помощью обратных вызовов, слушателей и передаваемого контекста, чтобы попытаться получить доступ к ActionBar из RecyclerViewAdapter, но я не знаю, применимы ли они к Kotlin, и при этом они не имеют большого смысла, имеявсегда держал весь мой код в RecyclerViewAdapter (поиск в базе данных, запись, обновления CardView и т. д.)

Вот очень сокращенный код для моего вызывающего кода и RecyclerViewAdapter (но я надеюсь, что у меня есть всеважные компоненты):

class ItemRecyclerViewAdapter(private val itemArray: MutableList<ItemObject>, private val contextABC: Context) : RecyclerView.Adapter<ItemRecyclerViewAdapter.ViewHolder>() {

    inner class ViewHolder(v: View) : RecyclerView.ViewHolder(v) {
        private val cardViewAdd: Button

        init {
            cardViewAdd = v.findViewById<View>(R.id.cardview_item_Add) as Button

            // Add one to Qty Ordered
            cardViewAdd.setOnClickListener { updateItemQty(adapterPosition, itemArray[adapterPosition].qtyOrdered + 1, v) }
        }
    }

private fun updateItemQty(arrayPosition: Int, pQtyOrdered: Int, v: View) {
            itemArray[arrayPosition].qtyOrdered = pQtyOrdered
            notifyItemChanged(arrayPosition)
    }
}
class CartActivity : BaseActivity() {
    internal var cartItemsList: MutableList<ItemObject> = ArrayList()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.cart_master)

        cartItemsList = DatabaseAdapter.cartItems
        cart_RecyclerView.setHasFixedSize(true)
        cart_RecyclerView.layoutManager = LinearLayoutManager(this)
        rvAdapter = ItemRecyclerViewAdapter(cartItemsList, this)
        cart_RecyclerView.adapter = rvAdapter
    }
}

Кто-нибудь может заставить меня двигаться в правильном направлении?Я, конечно, ценю помощь!

[Редактировать] С большой помощью Бирю Вачхани, вот мой рабочий код:

class ItemRecyclerViewAdapter(private val itemArray: MutableList<ItemObject>,
    private val contextABC: Context, val updateActionBarTitle: (ItemObject) -> Unit = {})
 : RecyclerView.Adapter<ItemRecyclerViewAdapter.ViewHolder>() {

    inner class ViewHolder(v: View) : RecyclerView.ViewHolder(v) {
        private val cardViewAdd: Button

        init {
            cardViewAdd = v.findViewById<View>(R.id.cardview_item_Add) as Button

            // Add one to Qty Ordered
            cardViewAdd.setOnClickListener { updateItemQty(adapterPosition, itemArray[adapterPosition].qtyOrdered + 1, v) }
        }
    }

private fun updateItemQty(arrayPosition: Int, pQtyOrdered: Int, v: View) {
            itemArray[arrayPosition].qtyOrdered = pQtyOrdered
            notifyItemChanged(arrayPosition)
            updateActionBarTitle(itemArray[arrayPosition])
    }
}
class CartActivity : BaseActivity() {
    internal var cartItemsList: MutableList<ItemObject> = ArrayList()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.cart_master)

        cartItemsList = DatabaseAdapter.cartItems
        cart_RecyclerView.setHasFixedSize(true)
        cart_RecyclerView.layoutManager = LinearLayoutManager(this)
        rvAdapter = ItemRecyclerViewAdapter(cartItemsList, this){item->
            supportActionBar?.setTitle("hi")
        }
        cart_RecyclerView.adapter = rvAdapter
    }
}

1 Ответ

0 голосов
/ 10 июля 2019

Вы можете сделать это с помощью лямбда-функций Kotlin, например:

адаптер:

class ItemRecyclerViewAdapter(
    private val itemArray: MutableList<ItemObject>,
    val onItemAdded: (ItemObject) -> Unit = {}
) :
    RecyclerView.Adapter<ItemRecyclerViewAdapter.ViewHolder>() {

    override fun getItemCount(): Int {
        return itemArray.size
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_layout,parent,false))
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.cardViewAdd.setOnClickListener {
            updateItemQty(position, itemArray[position].qtyOrdered + 1)
            onItemAdded(itemArray[position])
        }
    }

    class ViewHolder(v: View) : RecyclerView.ViewHolder(v) {
        val cardViewAdd: Button = v.findViewById(R.id.cardview_item_Add)

        fun bind(item:ItemObject){
            // bind your data with view here
        }
    }

    fun updateItemQty(arrayPosition: Int, pQtyOrdered: Int) {
        itemArray[arrayPosition].qtyOrdered = pQtyOrdered
        notifyItemChanged(arrayPosition)
    }
}

В вашей деятельности:

класс CartActivity: BaseActivity () { внутренняя переменная cartItemsList: MutableList = ArrayList ()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.cart_master)

    cartItemsList = DatabaseAdapter.cartItems
    cart_RecyclerView.setHasFixedSize(true)
    cart_RecyclerView.layoutManager = LinearLayoutManager(this)
    rvAdapter = ItemRecyclerViewAdapter(cartItemsList, this){item->
        // here you can access your ActionBar as perform actions on it
    }
    cart_RecyclerView.adapter = rvAdapter
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...