Формирование одного списка с условием из другого в Room database

В базе данных хранятся даты, и еще некоторые другие параметры. На главной активности в RecyclerView я отображаю один список который состоит из всех данных. На другой (дополнительной) активности я хочу отображать только даты, но с одним условием, которое мне никак не получается реализовать. Во втором списке должны быть все даты которые есть в таблице, но если они в таблице повторяются, то в списке должны быть отображены только один раз.

Получается, что нужно еще постоянно проверять, не удалил ли пользователь дату в первом списке. Можете подсказать, хотя бы, где должна быть эта проверка? В адаптере в методе onBindViewHolder или в самом классе дополнительной активности?

Таблица выглядит так:

@Entity(tableName = "data_table")
public class Data {
@PrimaryKey(autoGenerate = true)
public int id;

public String date;

public float xValue;
public float yValue;

public Data(String date, float xValue, float yValue) {
    this.date = date;
    this.xValue = xValue;
    this.yValue = yValue;
}

Метод получения всех записей:

@Query("SELECT * FROM data_table ORDER BY id ASC")
LiveData<List<Data>> getAllData();

Просто в MainActivity при добавлении данных пользователь сначала выбирает дату с помощью DatePickerDialog, потом переходит на следующую активность, добавляет все остальные данные и у них автоматически сохраняется та дата, которую пользователь добавил в начале (currentDate). Была идея в момент когда пользователь выбирает дату, сохранить ее в ArrayList который потом передать на дополнительную активность и показать в RecyclerView:

добавление в массив строк в MainActivity:

String currentDate;
ArrayList<String> dates = new ArrayList<>();


@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
    Calendar c = Calendar.getInstance();
    c.set(Calendar.YEAR, year);
    c.set(Calendar.MONTH, month);
    c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
    currentDate = DateFormat.getDateInstance(DateFormat.DEFAULT).format(c.getTime());
    dates.add(currentDate);

    Intent intent = new Intent(MainActivity.this, AddDataActivity.class);
    intent.putExtra(CURRENT_DATE, currentDate);
    startActivityForResult(intent, ADD_NOTE_REQUEST);
}

Код адаптера в этом случае:

public class SecondAdapter extends RecyclerView.Adapter<SecondAdapter.DataViewHolder> {
private ArrayList<String> list = new ArrayList<>();

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

@Override
public void onBindViewHolder(@NonNull DataViewHolder holder, int position) {
   for (int i = 0; i < list.size(); i++){
       String date = list.get(i);
       holder.date.setText(date);
   }
}

public void setData(ArrayList<String> data) {
    this.list = data;
    notifyDataSetChanged();
}

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

class DataViewHolder extends RecyclerView.ViewHolder{

    private TextView date;

    public DataViewHolder(@NonNull View itemView) {
        super(itemView);
        date = itemView.findViewById(R.id.tv_date2);
    }
}
}

и код дополнительной активности:

public class DateListActivity extends AppCompatActivity {

private DataViewModel viewModel;
ArrayList<String> dates = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_date_list);

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close);

    final SecondAdapter adapter = new SecondAdapter();
    viewModel = new ViewModelProvider(this).get(DataViewModel.class);
    Intent intent = getIntent();
    dates = intent.getStringArrayListExtra("dates");
    adapter.setData(dates);

    RecyclerView recyclerView = findViewById(R.id.recycler_2);
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setHasFixedSize(true);
}
}

Но оказалось, что тогда я не могу отслеживать изменения в первом листе на главной активности. Да и вообще, если пользователь захочет добавить еще один элемент в таблицу с точно такой же датой, какая уже есть в таблице, то она добавится в этот ArrayList, а по идее не должна... Скажите, пожалуйста, могу я в принципе такую идею осуществить или стоит отказаться от нее?


Ответы (0 шт):