Как обновить данные recyclerview из ItemTouchHelper? - PullRequest
0 голосов
/ 09 мая 2020

У меня есть повторный просмотр задач. Когда пользователь проведет пальцем по элементу, я хочу изменить один параметр (переменная isChecked с false на true - это будет означать, что задача завершена) в этой задаче.

Я создал новый экземпляр ItemTouchHelper в своей деятельности:

 new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
            Sorted current = adapter.getSortedAtPosition(viewHolder.getAdapterPosition());
            int time = current.getSortedDuration() + current.getSortedTimeBegin();
            int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
            int minute = Calendar.getInstance().get(Calendar.MINUTE);
            if (hour > time/60){
                //change
                Toast.makeText(ShowSortedActivity.this, "check1", Toast.LENGTH_SHORT).show();
            }
            else if (hour == time/60){
                if (minute > time % 60){
                    //change
                    Toast.makeText(ShowSortedActivity.this, "check2", Toast.LENGTH_SHORT).show();
                }
                else{
                    //do nothing
                    Toast.makeText(ShowSortedActivity.this, "uncheck1", Toast.LENGTH_SHORT).show();
                }
            }
            else{
                //do nothing
                Toast.makeText(ShowSortedActivity.this, "uncheck2", Toast.LENGTH_SHORT).show();
            }
        }
    }).attachToRecyclerView(showSorted);
}

Здесь я получаю задачу класса «Сортировано» и проверяю, меньше ли время окончания задачи, чем текущее время дня. Если это так, я хочу изменить переменную.

Мой класс адаптера:

public class SortedAdapter extends RecyclerView.Adapter<SortedAdapter.SortedViewHolder> {

private List<Sorted> list = new ArrayList<>();

@NonNull
@Override
public SortedViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.tasks2_layout , parent, false);
    return new  SortedAdapter.SortedViewHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull final SortedViewHolder holder, final int position) {
    final Sorted data = list.get(position);
    holder.title.setText(data.getSortedName());
    holder.date.setText(data.getSortedDate());
    holder.category.setText(String.valueOf(data.getSortedCategory()));
    holder.attach.setText(String.valueOf(data.isSortedAttach()));
    holder.to.setText(String.valueOf(toTime(data.getSortedDuration() + data.getSortedTimeBegin())));
    holder.from.setText(String.valueOf(toTime(data.getSortedTimeBegin())));
    holder.isChecked.setText(String.valueOf(data.isChecked()));    
}

public void setSortedData(List<Sorted> sortedList){
    this.list = sortedList;
    notifyDataSetChanged();
}

public Sorted getSortedAtPosition(int position){
    return list.get(position);
}

public void setSorted(Sorted data){

}

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

static class SortedViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{       

    private TextView title;
    private TextView date;
    private TextView from;
    private TextView to;
    private TextView category;
    private TextView attach;
    private TextView isChecked;

    SortedViewHolder(@NonNull View itemView) {
        super(itemView);
        title = itemView.findViewById(R.id.tv_title1);
        date = itemView.findViewById(R.id.tv_date1);
        from = itemView.findViewById(R.id.tv_from3);
        to = itemView.findViewById(R.id.tv_to3);
        category = itemView.findViewById(R.id.tv_category1);
        attach = itemView.findViewById(R.id.tv_attach1);
        isChecked = itemView.findViewById(R.id.tv_isChecked);
    }       
}

private static String toTime(int a) {
    String s = "";
    int b = a/60;
    int c = a%60;
    if (c < 10) {
        s =  b + " : " + 0 + c;
    }
    else {
        s =  b + " : " + c;
    }
    return s;
 }
}  

Сортированный класс:

@Entity
public class Sorted {
@PrimaryKey(autoGenerate = true)
public int id;

public String name;

public int timeBegin;

public int duration;

public int category;

public boolean attach;

public String date;

public String categoryChart;

public boolean checked;

public Sorted(String name, int timeBegin, int duration, int category, boolean attach, String date, String categoryChart, boolean checked) {
    this.name = name;
    this.timeBegin = timeBegin;
    this.duration = duration;
    this.category = category;
    this.attach = attach;
    this.date = date;
    this.categoryChart = categoryChart;
    this.checked = checked;
}

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

public String getSortedName() {
    return name;
}

public int getSortedTimeBegin() {
    return timeBegin;
}

public int getSortedDuration() {
    return duration;
}

public int getSortedCategory() {
    return category;
}

public boolean isSortedAttach() {
    return attach;
}

public String getSortedDate() {
    return date;
}

public String getSortedCategoryChart() {
    return categoryChart;
}

public boolean isChecked() {
    return checked;
}

public void setChecked(boolean checked) {
    this.checked = checked;
}
}

Моя проблема в том, что я действительно не понять, как это сделать. Есть ли способ обновить данные, а не создать новую задачу? Или мне нужно удалить полученную задачу и вставить новую, с измененным одним параметром? Может, я смогу сделать так же, как обновляю список? :

public void setSortedData(List<Sorted> sortedList){
this.list = sortedList;
notifyDataSetChanged();
 } 

А может мне не нужен адаптер, а только база данных? (Я использую Room). Заранее благодарим за помощь. Если нужно, дополню вопрос.

1 Ответ

1 голос
/ 09 мая 2020

В методе onSwipe для изменения пользовательского интерфейса вам нужно только вызвать какой-то метод, который нужно установить для модели current, и вызвать adapter.notifyItemChange(viewHolder.getAdapterPosition()), не нужно создавать новый объект или новый список

Я знаю, что вы используете Room don ' Не забудьте обновить его в базе данных. Дополнительно, если вы используете Rx Java или Flow и LiveData, вам нужно обновить объект. Номер автоматически обновляет новый список для вас

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