Когда я нажимаю на «Карточку», цвет иногда меняется, а иногда нет. Часто случается, что изменившийся цвет не сохраняется. Я хочу создать что-то вроде страницы уведомлений Facebook, где мы узнаем об уведомлениях о прочтении по измененному цвету карты. Но есть некоторая проблема с моим классом адаптера. Пожалуйста, помогите мне.
Я попытался сохранить состояния цвета в общих настройках, но желаемый результат не был достигнут. Я думаю, что проблема должна быть в моей логике переключения. У меня нет профессионального опыта программирования под Android. Пожалуйста, помогите мне. Мое приложение находится на финальной стадии.
public class PyqAdapter extends RecyclerView.Adapter<PyqAdapter.ViewHolder> {
private final Context mCtx;
private final List<PyqModel> pyqModelList;
private final int defaultBackgroundColor;
private final int selectedBackgroundColor;
private final Set<Integer> selectedPositions;
private static final String PREFS_NAME = "PyqAllItems";
private static final String SELECTED_ITEMS_KEY = "PyqSelectedItems";
public PyqAdapter(Context mCtx, List<PyqModel> pyqModelList) {
if (mCtx == null) {
throw new IllegalArgumentException("Context cannot be null");
}
this.mCtx = mCtx;
this.pyqModelList = pyqModelList;
this.selectedPositions = new HashSet<>();
// Load colors based on the current theme
Resources res = mCtx.getResources();
int nightModeFlags = res.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
if (nightModeFlags == Configuration.UI_MODE_NIGHT_YES) {
defaultBackgroundColor = ContextCompat.getColor(mCtx, R.color.defaultBackgroundDark);
selectedBackgroundColor = ContextCompat.getColor(mCtx, R.color.selectedBackgroundDark);
} else {
defaultBackgroundColor = ContextCompat.getColor(mCtx, R.color.defaultBackgroundLight);
selectedBackgroundColor = ContextCompat.getColor(mCtx, R.color.selectedBackgroundLight);
}
// Load selected states from SharedPreferences
SharedPreferences prefs = mCtx.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
Set<String> selectedItems = prefs.getStringSet(SELECTED_ITEMS_KEY, new HashSet<>());
for (String position : selectedItems) {
selectedPositions.add(Integer.parseInt(position));
}
// Set selection state on models based on loaded positions
for (int i = 0; i < pyqModelList.size(); i++) {
PyqModel model = pyqModelList.get(i);
model.setSelected(selectedPositions.contains(i));
}
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.pyq_rv_layout, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
final PyqModel temp = pyqModelList.get(position);
// Set text views
holder.textView.setText(temp.getPdfName());
holder.serialNumber.setText(String.valueOf(position + 1));
holder.pyqTopics.setText(temp.getPyqTopics());
// Use holder.getAdapterPosition() to get the current position
int adapterPosition = holder.getAdapterPosition();
if (adapterPosition == RecyclerView.NO_POSITION) {
return;
}
// Set background color based on selection state
if (temp.isSelected()) {
holder.cardView.setCardBackgroundColor(selectedBackgroundColor);
} else {
holder.cardView.setCardBackgroundColor(defaultBackgroundColor);
}
holder.cardView.setOnClickListener(v -> {
SharedPreferences prefs = mCtx.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
Set<String> selectedItems = new HashSet<>();
for (int pos : selectedPositions) {
selectedItems.add(String.valueOf(pos));
}
selectedPositions.add(adapterPosition);
editor.putStringSet(SELECTED_ITEMS_KEY, selectedItems);
// Notify adapter to refresh views
notifyItemChanged(adapterPosition);
editor.apply();
// Launch ViewPdf activity
Intent i = new Intent(holder.cardView.getContext(), ViewPdf.class);
i.putExtra("pdfName", temp.getPdfName());
i.putExtra("pdfUrl", temp.getPdfUri());
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
holder.cardView.getContext().startActivity(i);
});
}
@Override
public int getItemCount() {
return pyqModelList.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
CardView cardView;
TextView textView, serialNumber, pyqTopics;
public ViewHolder(View itemView) {
super(itemView);
cardView = itemView.findViewById(R.id.pyqCardView);
textView = itemView.findViewById(R.id.pyqTitle);
serialNumber = itemView.findViewById(R.id.serialNumber);
pyqTopics = itemView.findViewById(R.id.pyqTopics);
}
}
}
Добавь это :
private List<Integer> highlightedPositions;
вместо этого:
private final Set<Integer> selectedPositions;
в вашем классе адаптера.
Затем используйте эти две функции для сохранения, а затем загрузки позиций карт, выбранных пользователем.
private void loadHighlightedPositions() {
SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE);
String positionsString = sharedPreferences.getString("highlightedPositions", "");
if (!positionsString.isEmpty()) {
String[] positionsArray = positionsString.split(",");
for (String position : positionsArray) {
highlightedPositions.add(Integer.parseInt(position));
}
}
}
private void saveHighlightedPositions() {
SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
StringBuilder positionsString = new StringBuilder();
for (int position : highlightedPositions) {
positionsString.append(position).append(",");
}
if (positionsString.length() > 0) {
positionsString.deleteCharAt(positionsString.length() - 1); // Remove the trailing comma
}
editor.putString("highlightedPositions", positionsString.toString());
editor.apply();
}
Затем используйте это в методе onBindviewHolder():
if (highlightedPositions.contains(position)) {
holder.itemView.setBackgroundColor(selectedBackgroundColor); // Change to your desired color
} else {
holder.itemView.setBackgroundColor(defaultBackgroundColor); // Default color
}
Затем используйте эти две функции в классе адаптера, чтобы добавлять и удалять позицию в зависимости от того, выбрана ли она уже или нет.
public void addPosition(int position) {
if (!highlightedPositions.contains(position)) {
highlightedPositions.add(position);
saveHighlightedPositions();
notifyItemChanged(position);
}
}
public void removePosition(int position) {
if (highlightedPositions.contains(position)) {
highlightedPositions.remove((Integer) position);
saveHighlightedPositions();
notifyItemChanged(position);
}
}
Затем используйте это в onClickListener для элемента вашей карты:
holder.itemView.setOnClickListener(v -> {
if (highlightedPositions.contains(position)) {
highlightedPositions.remove((Integer) position);
} else {
highlightedPositions.add(position);
}
saveHighlightedPositions();
notifyItemChanged(position);
});
P.S. Вам необходимо внести изменения в подход к хранению общих настроек. Надеюсь, это поможет.
Огромное тебе спасибо, братан. Ваш ответ решил проблему.