STRIKE_THRU_TEXT_FLAG не работает должным образом - PullRequest
0 голосов
/ 30 января 2020

Это мой класс адаптера RecyclerView

public class TodoAdaptor extends RecyclerView.Adapter<TodoAdaptor.SingleTodoView> {

    private CheckBox checkbox;
    private TextView title, dueDate;
    private Context context;
    private ArrayList<SingleTodo> todoList;
    private onItemCLickListener itemCLickListener;

    public TodoAdaptor(Context context, ArrayList<SingleTodo> todoList, onItemCLickListener onItemClickListener) {
        this.context = context;
        this.todoList = todoList;
        this.itemCLickListener = onItemClickListener;
    }


    @NonNull
    @Override
    public SingleTodoView onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_todo, parent, false);
        return new SingleTodoView(v, itemCLickListener);
    }

    @Override
    public void onBindViewHolder(@NonNull SingleTodoView holder, int position) {
        SingleTodo singleTodo = todoList.get(position);
        checkbox.setChecked(singleTodo.isComplete());
        title.setText(singleTodo.getTitle());
         if (singleTodo.isComplete()) {
            title.setPaintFlags(title.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
            Toast.makeText(context, "IsCompleted", Toast.LENGTH_SHORT).show();
        } else {
            title.setPaintFlags(title.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
            Toast.makeText(context, "Not IsCompleted", Toast.LENGTH_SHORT).show();
        }
        if (singleTodo.getDueDate().isEmpty()) {
            dueDate.setVisibility(View.GONE);
        } else {
            dueDate.setText(singleTodo.getDueDate());
        }
    }

    @Override
    public int getItemCount() {
        return todoList.size();
    }

    class SingleTodoView extends RecyclerView.ViewHolder {

        private SingleTodoView(@NonNull View itemView, final onItemCLickListener itemCLickListener) {
            super(itemView);
            checkbox = itemView.findViewById(R.id.todo_list_completed_checkbox);
            title = itemView.findViewById(R.id.todo_list_title);
            dueDate = itemView.findViewById(R.id.todo_list_due_date);
            title.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    itemCLickListener.onTextClickListener(getAdapterPosition());
                }
            });
            checkbox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    itemCLickListener.onCheckboxClickListener(getAdapterPosition());
                }
            });
        }
    }

    public interface onItemCLickListener {
        void onTextClickListener(int position);
        void onCheckboxClickListener(int position);
    }
}

Это мой адаптер

 todoAdaptor = new TodoAdaptor(this, singleTodoArrayList, new TodoAdaptor.onItemCLickListener() {
            @Override
            public void onTextClickListener(int position) {
                singleTodo = singleTodoArrayList.get(position);
                singleTodo.setTitle("This is Test");
                singleTodoArrayList.set(position, singleTodo);
                todoAdaptor.notifyItemChanged(position);
            }

            @Override
            public void onCheckboxClickListener(int position) {
                singleTodo = singleTodoArrayList.get(position);
                singleTodo.setComplete(!singleTodo.isComplete());
                singleTodoArrayList.set(position, singleTodo);
                todoAdaptor.notifyItemChanged(position);
            }
        });

, а это мой класс SingleTodo

package com.example.simpletodo.classes;

public class SingleTodo {
    private int id;
    private String title;
    private String dueDate;
    private boolean isComplete;

    public SingleTodo(int id, String title, String dueDate, boolean isComplete) {
        this.id = id;
        this.title = title;
        this.dueDate = dueDate;
        this.isComplete = isComplete;
    }

    public int getId() {
        return id;
    }

    public String getTitle() {
        return title;
    }

    public String getDueDate() {
        return dueDate;
    }

    public boolean isComplete() {
        return isComplete;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setDueDate(String dueDate) {
        this.dueDate = dueDate;
    }

    public void setComplete(boolean complete) {
        isComplete = complete;
    }
}

Всякий раз, когда я проверяю флажок, текст этого элемента должен закрашивать зачеркивание, и оно не работает, как ожидалось хотя объект обновляется, как и должно быть), и зачеркнутый текст возвращается к нормальному состоянию, и мне нужно дважды установить флажок для флажка, чтобы снять флажок

другая проблема заключается в том, что когда я проверяю элемент, а затем пытаюсь чтобы проверить другой элемент, текст текущего элемента будет заменен одним из других проверенных элементов текста. Изображения:
По умолчанию:
default
Когда я нажимаю флажок один раз:
Clicked on Checkbox Once
Когда я снова нажимаю флажок:
Checkbox Checked Twice
Когда я Проверял несколько элементов один за другим (я не менял положение ни одного элемента перед проверкой, что они были в порядке по умолчанию, и после проверки - по порядку - вот что я получаю)
multiple Checkbox Issue
Любая помощь приветствуется , Я просто хочу, чтобы мой код работал так, как ожидалось.

1 Ответ

0 голосов
/ 04 февраля 2020

Я нашел решение от этого Вопроса

Мне пришлось изменить свой класс адаптера. Я объявил виды внутри моего класса держателя вида и onBindViewHolder, я использую первый параметр (держатель), чтобы получить мои представления

public class TodoAdaptor extends RecyclerView.Adapter<TodoAdaptor.SingleTodoView> {
    private boolean darkTheme;
    private Context context;
    private ArrayList<SingleTodo> todoList;
    private onItemCLickListener itemCLickListener;

    public TodoAdaptor(Context context, ArrayList<SingleTodo> todoList, boolean darkTheme, onItemCLickListener onItemClickListener) {
        this.darkTheme = darkTheme;
        this.context = context;
        this.todoList = todoList;
        this.itemCLickListener = onItemClickListener;
    }


    @NonNull
    @Override
    public SingleTodoView onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(context).inflate(R.layout.single_todo, parent, false);
        return new SingleTodoView(v, itemCLickListener);
    }

    @Override
    public void onBindViewHolder(@NonNull SingleTodoView holder, int position) {
        SingleTodo singleTodo = todoList.get(position);
        holder.checkbox.setChecked(singleTodo.isComplete());
        holder.title.setText(singleTodo.getTitle());
        if (singleTodo.isComplete()) {
            holder.title.setPaintFlags(holder.title.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
        } else {
            holder.title.setPaintFlags(holder.title.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
        }
        if (singleTodo.getDueDate().isEmpty()) {
            holder.dueDate.setVisibility(View.GONE);
        } else {
            holder.dueDate.setVisibility(View.VISIBLE);
            holder.dueDate.setText(singleTodo.getDueDate());
        }
    }

    @Override
    public int getItemCount() {
        return todoList.size();
    }

    class SingleTodoView extends RecyclerView.ViewHolder {

        private CheckBox checkbox;
        private TextView title, dueDate;
        private SingleTodoView(@NonNull View itemView, final onItemCLickListener itemCLickListener) {
            super(itemView);
            checkbox = itemView.findViewById(R.id.todo_list_completed_checkbox);
            title = itemView.findViewById(R.id.todo_list_title);
            dueDate = itemView.findViewById(R.id.todo_list_due_date);
            if (darkTheme) {
                title.setTextColor(context.getResources().getColor(R.color.colorLightGray));
                dueDate.setTextColor(context.getResources().getColor(R.color.colorLightGray));
            } else {
                title.setTextColor(context.getResources().getColor(R.color.colorBlack));
                dueDate.setTextColor(context.getResources().getColor(R.color.colorBlack));
            }

            title.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    itemCLickListener.onTextClickListener(getAdapterPosition());
                }
            });
            checkbox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    itemCLickListener.onCheckboxClickListener(getAdapterPosition());
                }
            });
        }
    }

    public interface onItemCLickListener {
        void onTextClickListener(int position);

        void onCheckboxClickListener(int position);
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...