Как я могу изменить цвет фона представления карты при нажатии и сохранить изменение цвета постоянным?

Когда я нажимаю на «Карточку», цвет иногда меняется, а иногда нет. Часто случается, что изменившийся цвет не сохраняется. Я хочу создать что-то вроде страницы уведомлений 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);
        }
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавь это :

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. Вам необходимо внести изменения в подход к хранению общих настроек. Надеюсь, это поможет.

Огромное тебе спасибо, братан. Ваш ответ решил проблему.

Satish Bodke 31.07.2024 14:13

Другие вопросы по теме