У меня есть фрагмент, который содержит список предметов в переработанном виде. Под ними есть флажок, который имеет «невидимое» состояние. Когда элемент нажимается, я переключаю это состояние. До сих пор я заставил это работать, но не уверен, что использовал лучший подход.
Проблема здесь в том, что я хочу иметь возможность отмечать / снимать все пункты с основного флажка на панели инструментов фрагмента, а также получать общее количество выбранных и невыбранных элементов и отправлять их для отображения в активности хоста. Я всегда получаю неправильные значения и не могу проверить все элементы из действия. Правильна ли эта реализация?
Я правильно инициализировал все представления и смог отобразить lsit, но когда я попытался передать метод со значениями из видоискателя адаптера в родительский фрагмент, ничего не отражается.
Код фрагмента: // пропущенные инициализации
public class MarkAttendanceFragment extends DialogFragment implements View.OnClickListener, CompoundButton.OnCheckedChangeListener {
private static final String TAG = MarkAttendanceFragment.class.getSimpleName();
private Toolbar toolbar;
private ImageView closeIV;
private TextView sessionNameAttendanceTV, totalTV, presentTV, absentTV;
private Button doneBtn;
private CheckBox checkAll;
private RecyclerView attRV;
private MarkAttendanceAdapter adapter;
private List<PlayerSession> playersList = new ArrayList<>();
private int numPresent = 0, numAbsent = 0, sumPlayers = 0;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_mark_attendance, container, false);
init(view);
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
closeIV.setOnClickListener(this);
checkAll.setOnCheckedChangeListener(this);
doneBtn.setOnClickListener(this);
return view;
}
private void init(View view) {
numPresent = adapter.sendNumChecked();
Log.d(TAG, "Num Checked:\t" + numPresent);
presentTV.setText(numPresent + "");
sumPlayers = adapter.getItemCount();
Log.d(TAG, "Sum Players:\t" + sumPlayers);
totalTV.setText(sumPlayers + "");
numAbsent = sumPlayers - numPresent;
Log.d(TAG, "Num Absent:\t" + numAbsent);
absentTV.setText(numAbsent + "");
}
и отметьте все методы, используя чекбокс составной кнопки фрагмента:
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
adapter.checkAll();
} else {
adapter.unCheckAll();
}
}
Вот методы адаптера:
@Override
public void onBindViewHolder(final MarkAttendanceViewHolder viewholder, int position) {
final PlayerSession players = itemsList.get(position);
viewholder.namePlayerTV.setText(players.getFirstName() + " " + players.getLastName());
Picasso.with(context)
.load(players.getImageURL())
.placeholder(R.drawable.app_logo_resized)
.into(viewholder.playerAvatarIV);
final boolean isClicked = players.isSelected();
viewholder.playerAvatarIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// viewholder.checkBoxPlayer.setVisibility(isClicked ? View.VISIBLE : View.INVISIBLE);
// players.setSelected(!players.isSelected());
// players.setSelected(!isClicked);
// Log.d(TAG, "Sel Status " + players.isSelected());
// boolean isChecked = viewholder.checkBoxPlayer.isChecked();
if (viewholder.checkBoxPlayer.isChecked()) {
// if (selectedList.contains(players.getFirstName())) {
// selectedList.remove(players.getFirstName());
// Log.d(TAG, "Removed:\t" + players.getFirstName());
// }
viewholder.checkBoxPlayer.setChecked(false);
viewholder.checkBoxPlayer.setVisibility(View.INVISIBLE);
} else {
// if (!selectedList.contains(players.getFirstName())) {
// selectedList.add(players.getFirstName());
// Log.d(TAG, "Added:\t" + players.getFirstName());
// }
viewholder.checkBoxPlayer.setChecked(true);
viewholder.checkBoxPlayer.setVisibility(View.VISIBLE);
}
}
});
viewholder.checkBoxPlayer.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.d(TAG, "Checked:\t" + isChecked);
if (isChecked) {
viewholder.checkBoxPlayer.setVisibility(View.VISIBLE);
players.setSelected(isChecked);
numPresent++;
Log.d(TAG, "Checkbox visible:\t and count:\t" + numPresent);
} else {
viewholder.checkBoxPlayer.setVisibility(View.INVISIBLE);
players.setSelected(isChecked);
numPresent--;
Log.d(TAG, "Checkbox invisible:\t and count:\t" + numPresent);
}
}
});
}
@Override
public int getItemCount() {
if (itemsList == null) {
return 0;
}
return itemsList.size();
}
public void checkAll() {
vh.checkBoxPlayer.setChecked(true);
}
public void unCheckAll() {
vh.checkBoxPlayer.setChecked(false);
}
public int sendNumChecked() {
return numPresent;
}
Текстовые представления во фрагменте должны получать динамические обновления проверенного состояния из переработанного адаптера представления, а также, когда все элементы отмечены или не отмечены. Как мне закончить эту реализацию? Спасибо.