Как обновить ProgressBar с помощью CheckBox?
Всем доброго времени суток!
Имеется RecyclerView, 5 фрагментов, в кажом фрагменте - список, в списке - каждая ячейка содержит две строчки и один CheckBox, вопрос стоит в следующем, при нажатии на CheckBox, ProgressBar должен обновляться, как это сделать?
Обновляться должно в одном фрагменте, при переходе на второй фрагмент, там должно быть 0%!
Код адаптера:
class RVAClass(private val context: Context, private val lt: List<PClass>, private val key: String) : RecyclerView.Adapter<RVAClass.ViewHolder>() {
private val inflater: LayoutInflater = LayoutInflater.from(context)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = inflater.inflate(R.layout.list_item, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val list = lt[position]
holder.sName1.text = list.sText1
holder.sName5.text = list.sText3
holder.sName2.text = list.sText2
holder.sName5.setTextColor(ContextCompat.getColor(context, R.color.tintcolor2_off))
holder.sName5.setOnCheckedChangeListener(null)
//SharedPreferences
if (load(key + holder.adapterPosition, context)) {
holder.sName5.isChecked = true
holder.sName5.setTextColor(ContextCompat.getColor(context, R.color.tintcolor2_on))
holder.sName4.setBackgroundResource(R.drawable.card_bg_act)
} else {
holder.sName5.isChecked = false
}
//Cards set
holder.sName4.setOnClickListener {
holder.sName5.isChecked = true
holder.sName5.setTextColor(ContextCompat.getColor(context, R.color.tintcolor2_on))
holder.sName4.setBackgroundResource(R.drawable.card_bg_act)
save(true, key + holder.adapterPosition, context)
}
//Checkboxes set
holder.sName5.setOnCheckedChangeListener { _, _ ->
if (holder.sName5.isChecked) {
holder.sName5.isChecked = true
holder.sName5.setTextColor(ContextCompat.getColor(context, R.color.tintcolor2_on))
holder.sName4.setBackgroundResource(R.drawable.card_bg_act)
save(true, key + holder.adapterPosition, context)
} else {
holder.sName5.isChecked = false
holder.sName5.setTextColor(ContextCompat.getColor(context, R.color.tintcolor2_off))
holder.sName4.setBackgroundResource(R.drawable.card_bg_noact)
save(false, key + holder.adapterPosition, context)
}
}
}
override fun getItemCount(): Int {
return lt.size
}
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val sName1: TextView = view.findViewById(R.id.lblListItem)
val sName2: TextView = view.findViewById(R.id.lblListItem2)
val sName5: CheckBox = view.findViewById(R.id.checkBox2)
//val sName6: ProgressBar = view.findViewById(R.id.progressBar)
val sName4: RelativeLayout = view.findViewById(R.id.item_card)
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getItemViewType(position: Int): Int {
return position
}
}
Заранее спасибо!
Ответы (2 шт):
Непонятно где находится progressbar. Но в любом случае вам надо как-то передать команду в активити или фрагмент где находится ваш progressbar чтобы он обновил его.
Это можно сделать так:
class Class1 {
private String id = 1;
public String getId() {
return id;
}
}
class Class2 {
private String id;
public void setId(String id) {
this.id = id;
}
}
public static void main(String args[]) {
Class1 class1 = new Class1();
Class2 class2 = new Class2();
String id = class1.getId();
class2.setId(id);
}
Только вместо get или set вы можете добавить в активити любую функцию а потом вызвать её из RVAClass
Если я правильно понял, то ситуация такая: есть список из, скажем, 5 элементов. Если в одном из них ставим галочку, прогрессБар движется с 0 до 20%. Если во втором - до 40 и так до 100% при 5 проставленных галочках. Последующее есть смысл читать если я понял правильно.
По хорошему объекты, отображаемые в RecyclerVie, должны уметь сами понимать выбраны они или нет. В вашем случае они этого не умеют сами, эта инфа хранится в преферансах и меняется в момент клика по чекбоксу. В таком случае вам достаточно сообщить прогресс бару что он должен обновиться, он полностью читает данные по галочкам из преферансов и отрисовывает прогресс. "правильный" способ это сделать - создать интерфейс с названием в духе OnOptionsChange и методом onChange без параметров, в той активити или фрагменте где лежит прогресс бар реализовать его так, чтоб этот прогресс бар обновлялся. Экзепляр интерфейса передаем в ваш лист и/или адаптер, и в лямбде в setOnCheckedChangeListener после ифа добавляем listener?.onChange(). Все, теперь при каждом изменении чекбоксов активити/фрагмент будет выполнять onChange. в котором читает преферансы и выставляет нужный прогресс