RecyclerView Item

다음과 같이 각 아이템들로 구성된 리사이클러 뷰가 있다고 가정하자.

이후, 아이템 별 데이터를 세팅해주고 클릭 버튼을 누른 후 스크롤을 하면 데이터가 사라진다.

이렇게 되었을때 해결 방법 중 하나는 다음과 같다.

Adapter 내에 데이터가 많이 들어가 있을 경우 임시 저장  HashMap<Int, Object>를..

단순 CheckButton일 경우, SparseBooleanArray를 사용하면된다.

이는 들어오는 데이터 종류에 따라 자유롭게 사용하면된다.

 

백그라운드에서 어떻게 돌아가는지 생각해보자.

본 작성자는 Activity(TabLayout) -> Fragments(RecyclerView in Fragment) & Adapter 로 구성되어있다.

Activity가 꺼지지 않는 이상(onDestroy) Fragment 및 Adapter는 살아있다고 볼 수 있다.

그러므로 Adapter 내에 전역변수로 위 임시 저장 자료형을 선언해주고 데이터 변경 이벤트에 따라 itemPosition, Data를 넣어주면 된다.

이후 다른 탭을 가거나 스크롤을해도 문제 없어진다.

package com.Health.health.Trainer.UserListPackage.ProfilePack.ExerciseRequestPack.RequestExercise.RequestingExercise.Anaerobic

import android.graphics.Color
import android.text.Editable
import android.text.TextWatcher
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.widget.AppCompatButton
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.Health.health.ModulePackage.ExercisePack.ExerciseModule
import com.Health.health.Model.TrainerDataModel
import com.Health.health.R
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions

class RequestAbsAdapter : RecyclerView.Adapter<RequestAbsAdapter.ViewHolder>(){
    var exerciseModels = mutableListOf<TrainerDataModel.RequestingExerciseData>()
    var savedList = mutableListOf<TrainerDataModel.RequestingFinalExerciseData>()
    private val tempList = hashMapOf<Int, TrainerDataModel.TempRequestingData>()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RequestAbsAdapter.ViewHolder {
        val view: View? = LayoutInflater.from(parent.context).inflate(R.layout.anaerobic_item, parent, false)
        return ViewHolder(view!!)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(exerciseModels[position], position)
    }

    override fun getItemCount(): Int = exerciseModels.size

    override fun getItemViewType(position: Int): Int = position


    interface OnItemClickListener{
        fun onItemClick(v: View, position: Int, exercise: String, parameter: Double, url: String, weight: Int, set: Int, time: Int, hydro: String, minute: Int, part: String)
    }

    private var listener: OnItemClickListener? = null
    fun setOnItemClickListener(listener: OnItemClickListener){
        this.listener = listener
    }

    inner class ViewHolder(view: View): RecyclerView.ViewHolder(view){
        var weight: String = "10"
        var time: String = "12"
        var set: String = "3"
        val profileImage: ImageView = view.findViewById(R.id.image)
        val levelImage: ImageView = view.findViewById(R.id.levelImage)
        val levelText: TextView = view.findViewById(R.id.part)
        val exerciseName: TextView = view.findViewById(R.id.exercise)
        val weightEdit: EditText = view.findViewById(R.id.weightEdit)
        val timeEdit: EditText = view.findViewById(R.id.timeEdit)
        val setEdit: EditText = view.findViewById(R.id.setEdit)
        private val saveCheckButton: AppCompatButton = view.findViewById(R.id.SaveButton)
        fun bind(model: TrainerDataModel.RequestingExerciseData, position: Int){

            exerciseName.text = model.exerciseName


            //운동 사진
            ExerciseModule().imageSetter(profileImage, model.exerciseUrl, true)

            weightEdit.hint = weight
            timeEdit.hint = time
            setEdit.hint = set

            //강도 이미지
            val level = ExerciseModule().getDoubleValue(model.exerciseParameter)
            ExerciseModule().levelFilter(level, levelImage, levelText)



            for(saved in savedList){
                if(saved.exerciseName == model.exerciseName){
                    weightEdit.setText(saved.data["Weight"].toString())
                    timeEdit.setText(saved.data["Time"].toString())
                    setEdit.setText(saved.data["Sets"].toString())
                    weightEdit.isEnabled = false
                    timeEdit.isEnabled = false
                    setEdit.isEnabled = false
                    saveCheckButton.isClickable = false
                    saveCheckButton.isPressed = true
                }
            }

            if(tempList.containsKey(position)){
                weightEdit.setText(tempList[position]!!.weight)
                timeEdit.setText(tempList[position]!!.time)
                setEdit.setText(tempList[position]!!.set)
                saveCheckButton.isPressed = tempList[position]!!.bool
            }


            saveCheckButton.setOnClickListener{
                val minute = ExerciseModule().minuteFilter(time, set)
                if(position != RecyclerView.NO_POSITION){
                    listener?.onItemClick(itemView,
                        position,
                        model.exerciseName,
                        model.exerciseParameter.toString().toDouble(),
                        model.exerciseUrl,
                        weightEdit.text.toString().toInt(),
                        setEdit.text.toString().toInt(),
                        timeEdit.text.toString().toInt(),
                        "AnAerobic",
                        minute.toInt(),
                        "Abs")
                    it.background = ContextCompat.getDrawable(it.context, R.drawable.ic_coaching_select)
                    it.isClickable = false
                    tempList[position] = TrainerDataModel.TempRequestingData(
                        weightEdit.text.toString(),
                        timeEdit.text.toString(),
                        setEdit.text.toString(),
                        null,
                        true
                    )
                }
            }
        }
    }
}

 

+ Recent posts