Как сделать функцию для индикатора выполнения, для разных элементов в BaseAdapter - PullRequest
0 голосов
/ 25 мая 2019

Я использовал listview. У меня есть 5 предметов. Когда я запускаю программу, я вижу только 3. Обработчик для индикатора выполнения начинает работать для 3/5 элементов. Я иду, чтобы увидеть 4,5 пункта, поэтому я потерял из вида 1,2 пункта. Обработчик элементов 4 и 5 начинает работать.

//Adapter class    

var progress = 0
var gain = myData 
handler = Handler(Handler.Callback {
            progress = progress + speed
            if (progress >= 100) {
                progress = 0
                functionWhatChangeInFirebase(gain) 

            }

            iData.progressBar?.progress = progress

            handler?.sendEmptyMessageDelayed(0, 100)

            true 

        })
        handler.sendEmptyMessage(0)

Проблема в том, что когда я возвращаюсь к первому и второму элементу, обработчик запускает "новый поток" и индикатор выполнения имеет более одной функции, что изменило данные.

Редактировать Добавлен класс адаптера

package com.example.adventurepwr

import android.content.Context
import android.content.res.ColorStateList
import android.graphics.Color
import android.os.Handler
import android.support.design.widget.FloatingActionButton
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ProgressBar
import android.widget.TextView
import android.widget.Toast
import java.util.ArrayList

class AdapterItem(context: Context, private val itemList: ArrayList<Item>) : BaseAdapter() {


    private val mInflater: LayoutInflater = LayoutInflater.from(context)


    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {

        val current = itemList[position]


        val item: String = current.item!!
        val level: Int = current.level!!
        val price: Int = current.price!!
        val gain: Int = current.gain!!
        val speed: Int = current.speed!!
        val count: Int = current.count!!


        val view: View

        val iData: ItemsData

        if (convertView == null) {
            view = mInflater.inflate(R.layout.content_item, parent, false)
            iData = ItemsData(view)
            view.tag = iData

        } else {
            view = convertView
            iData = view.tag as ItemsData
        }



        iData.name?.text = item
        iData.level?.text = level.toString()
        iData.price?.text = price.toString()
        iData.gain?.text = gain.toString()
        iData.speed?.text = speed.toString()
        iData.count?.text = count.toString() 
        var progress: Int = 0
        var handler: Handler? = null


        iData.lvlButton?.setOnClickListener {

            canUpgrade(price, item)


        }



        handler = Handler(Handler.Callback {
            progress = progress + speed
            if (progress >= 100) {
                progress = 0
                addMoneyNormal(gain)

            }

            iData.progressBar?.progress = progress

            handler?.sendEmptyMessageDelayed(0, 100)

            true

        })
        handler.sendEmptyMessage(0)


        return view
    }

    override fun getItem(index: Int): Any {
        return itemList.get(index)
    }

    override fun getItemId(index: Int): Long {
        return index.toLong()
    }

    override fun getCount(): Int {
        return itemList.size
    }


    private class ItemsData(row: View?) {
        val name: TextView? = row!!.findViewById(R.id.name_item) as TextView?
        val level: TextView? = row!!.findViewById(R.id.lvl_Number) as TextView?
        val price: TextView? = row!!.findViewById(R.id.price_number) as TextView?
        val speed: TextView? = row!!.findViewById(R.id.speed) as TextView?
        val gain: TextView? = row!!.findViewById(R.id.gain) as TextView?
        val count: TextView? = row!!.findViewById(R.id.count_number) as TextView?

        val lvlButton: FloatingActionButton? = row!!.findViewById(R.id.lvl_up_button) as FloatingActionButton?

        val progressBar: ProgressBar? = row!!.findViewById(R.id.progressBar) as ProgressBar?
    }


}

Я иду на главную и сделать что-то вроде этого, но я получаю stackOverflow 8 МБ

fun progress(){

            for (oneRecord in itemList) {

                val item: Item = oneRecord
                item.count=item.count!! + item.speed!!

                if (item.count!!>100){
                    addMoneyNormal(item.gain!!)
                    item.count=0
                }

                Thread.sleep(1000)
            }

            adapterItem.notifyDataSetChanged()
            progress()
        }

        progress()

Может быть, мы можем что-то сделать с этим

Теперь progressBar.progress = count

Ответы [ 2 ]

0 голосов
/ 25 мая 2019
 val myRun = object : Runnable {


            override fun run() {

                for (oneRecord in mUploads) {

                    val item: Item = oneRecord
                    item.count = item.count!! + item.speed!!

                    if (item.count!! >= 100) {
                        item.count = 0
                        addMoneyNormal(item.gain!!)
                    }


                }

                adapterItem.notifyDataSetChanged()
                this@MainActivity.mHandler.postDelayed(this, 100)

            }

        }

        myRun.run()

Так что я использую это в своем основном классе

в адаптере, который я использовал, это количество прогрессии

Пока я не вижу никаких ошибок

0 голосов
/ 25 мая 2019

Я не уверен, но вам нужно переместить обработчик из getView(), и вы должны проверить каждый элемент.

Можете ли вы попробовать это:

fun testMethod(current) { 
    if(current.count < 4) { 
        return
    }

    handler = Handler(Handler.Callback {
        progress = progress + speed
        if (progress >= 100) {
            progress = 0
            addMoneyNormal(gain)
        }

        iData.progressBar?.progress = progress
        handler?.sendEmptyMessageDelayed(0, 100)
        true
    })

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