In my application i want use multiple CountDownerTimer for show offer times into RecyclerView.

For write this application i used Kotlin language.

I write below codes, but when scrolling on recyclerView's items start again this timer!

My mean is, timer started from 4:19sec, when scrolling on items and after 10sec show me 4:19 again instead of 4:09!

Activity codes:

class MainActivity : AppCompatActivity() {

private lateinit var apisList: ApisList

private lateinit var retrofit: Retrofit

private lateinit var todayAdapter: AuctionsTodayAdapter

private val todayModel: MutableList = mutableListOf()

private lateinit var layoutManager: RecyclerView.LayoutManager

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

//Initialize

retrofit = ApiClient.instance

apisList = retrofit.create(ApisList::class.java)

todayAdapter = AuctionsTodayAdapter(themedContext, todayModel)

layoutManager = LinearLayoutManager(themedContext)

//RecyclerView

main_list.setHasFixedSize(true)

main_list.layoutManager = layoutManager

main_list.adapter = todayAdapter

if (isNetworkAvailable()) getData(1, 10)

}

private fun getData(page: Int, limit: Int) {

main_loader.visibility = View.VISIBLE

val call = apisList.getAuctionsToday(page, limit)

call.let {

it.enqueue(object : Callback {

override fun onFailure(call: Call, t: Throwable) {

main_loader.visibility = View.GONE

Log.e("auctionsTodayList", t.message)

}

override fun onResponse(call: Call, response: Response) {

if (response.isSuccessful) {

response.body()?.let { itBody ->

main_loader.visibility = View.GONE

if (itBody.toString().isNotEmpty()) {

todayModel.clear()

todayModel.addAll(itBody.res.today)

todayAdapter.notifyDataSetChanged()

}

}

}

}

})

}

}

}

Adapter codes:

class AuctionsTodayAdapter(val context: Context, val model: MutableList) :

RecyclerView.Adapter() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyHolder {

val view = LayoutInflater.from(context).inflate(R.layout.row_main_list, parent, false)

val holder = MyHolder(view)

//holder.setIsRecyclable(false)

return holder

}

override fun getItemCount(): Int {

return model.size

}

override fun onBindViewHolder(holder: MyHolder, position: Int) {

val modelUse = model[position]

holder.setData(modelUse)

if (holder.newCountDownTimer != null) {

holder.newCountDownTimer!!.cancel()

}

var timer = modelUse.calculateEnd

timer = timer * 1000

holder.newCountDownTimer = object : CountDownTimer(timer, 1000) {

override fun onTick(millisUntilFinished: Long) {

var seconds = (millisUntilFinished / 1000).toInt()

val hours = seconds / (60 * 60)

val tempMint = seconds - hours * 60 * 60

val minutes = tempMint / 60

seconds = tempMint - minutes * 60

holder.rowMain_timer.rowMain_timer.text =

String.format("%02d", hours) + ":" + String.format(

"%02d",

minutes

) + ":" + String.format("%02d", seconds)

}

override fun onFinish() {

holder.rowMain_timer.text = "00:00:00"

}

}.start()

}

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

var newCountDownTimer: CountDownTimer? = null

lateinit var rowMain_timer: TextView

init {

rowMain_timer = itemView.findViewById(R.id.rowMain_timer)

}

fun setData(model: Today) {

model.image.let {

Glide.with(context)

.load(Constants.MAIN_BASE_URL + it)

.apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.RESOURCE))

.into(itemView.rowMain_img)

}

model.title.let { itemView.rowMain_title.text = it }

}

}

How can I fix it?

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐