다음과 같이 각 아이템들로 구성된 리사이클러 뷰가 있다고 가정하자.
이후, 아이템 별 데이터를 세팅해주고 클릭 버튼을 누른 후 스크롤을 하면 데이터가 사라진다.
이렇게 되었을때 해결 방법 중 하나는 다음과 같다.
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
)
}
}
}
}
}
'Computer engineering > Android Programming' 카테고리의 다른 글
2. Android App Architecture UI Layer (0) | 2022.07.09 |
---|---|
1. Android App Architecture 개요 (0) | 2022.07.09 |
안드로이드 Toolbar 없이 Toolbar만들기 (0) | 2022.06.14 |
RecyclerView & GirdLayout Decoration Customizing & Caution (0) | 2022.06.13 |
레이아웃 개요 (0) | 2021.04.24 |