Формирование одного списка с условием из другого в 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, а по идее не должна... Скажите, пожалуйста, могу я в принципе такую идею осуществить или стоит отказаться от нее?