Как обновить 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 шт):

Автор решения: Maks

Непонятно где находится 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. в котором читает преферансы и выставляет нужный прогресс

→ Ссылка