есть ли способ изменить текстовый вид текста в MainActivity, когда текст в строке повторного просмотра изменен в Kotlin - PullRequest
1 голос
/ 11 ноября 2019

Я пытаюсь сделать простое приложение, в котором я использую RecyclerView. Вот мои файлы.

MainActivity.kt

activity_main.xml -> с RecyclerView (recylerViewMain) single_row.xml -> одной строкой для recyclerViewMain

MainAdapter.kt ->где все привязки, ViewHolder и раздувание

У меня также Product.kt -> модель для продуктов

Теперь вот что я пытаюсь сделать.

Iдобавили кнопки «Плюс» и «Минус» на стороне itemUnit, и всякий раз, когда я щелкаю по этим элементам, он выполняет требуемую работу, увеличивая itemUnit и, в конечном итоге, itemAmount

Однако это происходит только в строке и неизменить подытог (TextView) в файле main_activity.xml.

Есть ли способ изменить main_activity textView при каждом изменении textView в строке Recyclerview (или при нажатии кнопкинажал на строку)?

Я редактирую код здесь. Sub Total сумма не меняется, пока я не нажму на кнопку предмета (Granola, Brownie и т. Д.). Только после того, как я нажму на эти элементы, Sub Total изменится и выдаст обновленную сумму.

интерфейсное решение не сработало для меня, я думаю, что я не смог правильно его реализовать.

вот коды;

class MainActivity : AppCompatActivity(), ItemChangeListener {
override var subTotalAmnt: Double = 30.0
//override var subTotalAmount: Double = 50.0

//override fun onItemPriceChange(20.0)

lateinit var mRecyclerView : RecyclerView
private lateinit var sDatabase: DatabaseReference
var trId: Long = 0

var discAmnt : Double = 0.00

var unt = 1

var tr :Trans ?= null

var sb = 0.00
var disc = sb*.1
var tt = sb-disc

var list = ArrayList<Product>()


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

    //var subto = findViewById(R.id.txtSubAmount) as TextView


   onItemPriceChange(20.0)
    txtSubAmount.text = subTotalAmnt.toString()

    sDatabase = FirebaseDatabase.getInstance().getReference().child("Sales")

    sDatabase.child("Sales").addValueEventListener(object:ValueEventListener{
        override fun onCancelled(p0: DatabaseError) {

        }

        override fun onDataChange(p0: DataSnapshot) {
            if(p0.exists()) {
                trId = p0.childrenCount
                println(trId)
            }
        }
    })
    mRecyclerView = findViewById(R.id.recyclerView_main)
    mRecyclerView.layoutManager = LinearLayoutManager(this)
    mRecyclerView.adapter = MainAdapter(this, list)

и мой класс адаптера;

class MainAdapter(val context: Context, val items : List<Product>) : RecyclerView.Adapter<MainAdapter.PartViewHolder>() {
override fun onBindViewHolder(p0: MainAdapter.PartViewHolder, p1: Int) {
    p0.bindItems(items[p1])
}


 var itemListener: ItemChangeListener? = null
fun setListener(listener: ItemChangeListener) {
    this.itemListener = listener
}

override fun getItemId(position: Int): Long {
    return super.getItemId(position)
}


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

// Inflates the item views
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PartViewHolder {


    // LayoutInflater: takes ID from layout defined in XML.
    // Instantiates the layout XML into corresponding View objects.
    // Use context from main app -> also supplies theme layout values!
    val inflater = LayoutInflater.from(parent.context)
    // Inflate XML. Last parameter: don't immediately attach new view to the parent view group
    val view = inflater.inflate(R.layout.sinlge_row, parent, false)

    return PartViewHolder(view)

}


// Binds each product in the ArrayList to a view


inner class PartViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {


    // Holds the TextView that will add each product to


    fun bindItems(prd: Product) {
        val textViewName = itemView.txtOrderNumber
        var textViewUnit = itemView.txtItemUnit
        val textViewPrice = itemView.txtItemPrice
        val textViewAmount = itemView.txtItemAmount


        var id = adapterPosition

        var unitN: Int = 1
        textViewName.text = prd.pName
        textViewUnit.text = prd.pUnit.toString()
        textViewPrice.text = prd.pPrice.toString()
        var itemPrice = prd.pPrice
        var itemAmount = itemPrice.times(unitN)
        textViewAmount.text = itemAmount.toString()

        itemView.btnPlus.setOnClickListener {

            println("item id : " + id)



            //itemListener = ItemChangeListener
            itemListener?.onItemPriceChange(10.0)

            // increase the Product model single unit
            prd.pUnit = unitN++

            // println("Here is the " +MainActivity().list.get(id))

            // bind txtItemUnit from single_row to changed unitN (single unit)
            textViewUnit.text = unitN.toString()

            // change the Product model single pAmount
            prd.pAmount = prd.pPrice.times(unitN)

            // bind txtItemAmount from single_row to Product pAmount
            textViewAmount.text = prd.pAmount.toString()

            //txtSubAmount.txt =

            //MainActivity().doSomething(subTotalAmount)


        }

        itemView.btnMinus.setOnClickListener(View.OnClickListener {

            if (unitN >= 1) {
                prd.pUnit = unitN--
                println(prd.pUnit)
                textViewUnit.text = unitN.toString()

                textViewAmount.text = prd.pPrice.times(unitN).toString()
            } else
                prd.pUnit = 1
            textViewUnit.text = prd.pUnit.toString()
            textViewAmount.text = prd.pPrice.times(prd.pUnit).toString()
        })


    }


}
}

и, интерфейс

interface ItemChangeListener {

var subTotalAmnt : Double

fun onItemPriceChange(subTotalAmount : Double){

    this.subTotalAmnt = subTotalAmount
    println("onItemPriceChange "+subTotalAmnt)

}
}

Прошу прощения за это ужасное объяснение, поскольку я не являюсь родным, но хочуобъяснить больше за помощь. after clicking plus and increasing the unit С уважением.

Отредактированный MainAdapter

class MainAdapter(val context: Context, val items : List<Product>) : RecyclerView.Adapter<MainAdapter.PartViewHolder>() {
override fun onBindViewHolder(p0: MainAdapter.PartViewHolder, p1: Int) {
    p0.bindItems(items[p1])
}


lateinit var itemListener: ItemChangeListener
fun setListener(listener: ItemChangeListener) {
    this.itemListener = listener
}

override fun getItemId(position: Int): Long {
    return super.getItemId(position)
}


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

// Inflates the item views
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PartViewHolder {


    // LayoutInflater: takes ID from layout defined in XML.
    // Instantiates the layout XML into corresponding View objects.
    // Use context from main app -> also supplies theme layout values!
    val inflater = LayoutInflater.from(parent.context)
    // Inflate XML. Last parameter: don't immediately attach new view to the parent view group
    val view = inflater.inflate(R.layout.sinlge_row, parent, false)

    return PartViewHolder(view)

}


// Binds each product in the ArrayList to a view


inner class PartViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {


    // Holds the TextView that will add each product to


    fun bindItems(prd: Product) {
        val textViewName = itemView.txtOrderNumber
        var textViewUnit = itemView.txtItemUnit
        val textViewPrice = itemView.txtItemPrice
        val textViewAmount = itemView.txtItemAmount


        var id = adapterPosition

        var unitN: Int = 1
        textViewName.text = prd.pName
        textViewUnit.text = prd.pUnit.toString()
        textViewPrice.text = prd.pPrice.toString()
        var itemPrice = prd.pPrice
        var itemAmount = itemPrice.times(unitN)
        textViewAmount.text = itemAmount.toString()

        itemView.btnPlus.setOnClickListener {

            println("item id : " + id)


            //itemListener = ItemChangeListener
            itemListener.onItemPriceChange(20.0)
            // increase the Product model single unit
            prd.pUnit = unitN++

            // println("Here is the " +MainActivity().list.get(id))

            // bind txtItemUnit from single_row to changed unitN (single unit)
            textViewUnit.text = unitN.toString()

            // change the Product model single pAmount
            prd.pAmount = prd.pPrice.times(unitN)

            // bind txtItemAmount from single_row to Product pAmount
            textViewAmount.text = prd.pAmount.toString()

            //txtSubAmount.txt =

            //MainActivity().doSomething(subTotalAmount)


        }

        itemView.btnMinus.setOnClickListener(View.OnClickListener {

            if (unitN >= 1) {
                prd.pUnit = unitN--
                println(prd.pUnit)
                textViewUnit.text = unitN.toString()

                textViewAmount.text = prd.pPrice.times(unitN).toString()
            } else
                prd.pUnit = 1
            textViewUnit.text = prd.pUnit.toString()
            textViewAmount.text = prd.pPrice.times(prd.pUnit).toString()
        })


    }


}
 }

1 Ответ

2 голосов
/ 11 ноября 2019

Я думаю, что вы можете сделать это, используя интерфейс .

  • Сначала вы создаете определение интерфейса (в отдельном файле или в адаптере). - например: интерфейс ItemChangeListener {fun onItemPriceChange (передать itemprice или totalprice)}
  • далее вы создаете объект слушателя внутри адаптера
  • Как lateinit varслушатель: ItemChangeListener внутри адаптера (устанавливается с помощью fun setListener (слушатель: ItemChangeListener) {// code} ).
  • Пусть основное действие реализует интерфейс.
  • передать mainActivity this в adapter.setListener
  • при нажатии кнопки вы можете вызвать listener.onItemPriceChange (передать itemprice или totalprice)
  • таким образом вы можете получить параметр для основной активности.

Проверьте эту ссылку для некоторых деталей .. То же самое можно сделать с помощью параметра конструктора, я думаю.

...