Я работаю над приложением, которое позволяет пользователю сделать снимок чека и сохранить его в категории расходов.В данный момент пользователь должен создать список категорий, а затем щелкнуть по значку, чтобы ввести квитанцию.Внутри этого activity
пользователь выбирает категорию, и после сохранения он должен отсортироваться по соответствующей категории и появиться в основном fragment
.
Для этого я создал CategoryAdapter (recyclerview)
, который раздувает ребенка recyclerview (ReceiptsAdapter)
в onBindViewHolder
.Я использую Room
, чтобы сохранить все данные в database
.Я также включил ViewModel
.
ПРОБЛЕМА:
Моя проблема заключается в том, что все элементы квитанции в настоящее время заполняются в каждую категорию с момента использования ViewModel.Когда я использовал runnables, все работало нормально, за исключением того, что ничего не сохранилось бы в первой категории.
В любом случае ниже приведен соответствующий код:
MainViewModel / CategoryViewModel
public class MainViewModel extends AndroidViewModel {
private LiveData<List<CategoryModel>> categories;
public MainViewModel(@NonNull Application application) {
super(application);
AppDatabase appDatabase = AppDatabase.getInstance(this.getApplication());
categories = appDatabase.categoryDao().loadCategories();
}
public LiveData<List<CategoryModel>> getCategories() {
return categories;
}
}
ReceiptsViewModel
public class ReceiptsViewModel extends ViewModel {
private LiveData<List<ReceiptEntity>> receipt;
public ReceiptsViewModel(AppDatabase database, String categoryName) {
receipt = database.receiptDao().findReceiptsForCategory(categoryName);
}
public LiveData<List<ReceiptEntity>> getReceipt() {
return receipt;
}
}
ReceiptsViewModelFactory
public class ReceiptsViewModelFactory extends ViewModelProvider.NewInstanceFactory {
private final String mCategoryName;
private final AppDatabase mDb;
public ReceiptsViewModelFactory(AppDatabase database, String categoryName) {
mDb = database;
mCategoryName = categoryName;
}
// Note: This can be reused with minor modifications
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
// noinspection unchecked
return (T) new ReceiptsViewModel(mDb, mCategoryName);
}
}
Класс ViewHolder в CategoryAdapter
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView categoryTv;
private RecyclerView receiptRv;
private ViewHolder(View itemView) {
super(itemView);
categoryTv = itemView.findViewById(R.id.category_tv);
receiptRv = itemView.findViewById(R.id.receipts_rv);
receiptsAdapter = new ReceiptsAdapter(mContext, mReceiptslist, mListener);
}
public void setData(List<ReceiptEntity> list) {
receiptsAdapter.setReceiptData(list);
}
}
@Override
public void onBindViewHolder(final @NonNull CategoryAdapter.ViewHolder holder, final int i) {
final String categoryName = mCategoriesList.get(i).getCategory();
String categoryNamePlusColon = categoryName + ": ";
holder.categoryTv.setText(categoryNamePlusColon);
// Receipts viewModel
ReceiptsViewModelFactory factory = new ReceiptsViewModelFactory(mDb, categoryName);
final ReceiptsViewModel viewModel = ViewModelProviders.of((FragmentActivity) mContext, factory).get(ReceiptsViewModel.class);
viewModel.getReceipt().observe((FragmentActivity) mContext, new Observer<List<ReceiptEntity>>() {
@Override
public void onChanged(@Nullable List<ReceiptEntity> receiptEntities) {
holder.setData(receiptEntities);
}
});
holder.receiptRv.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false));
holder.receiptRv.setHasFixedSize(true);
holder.receiptRv.setNestedScrollingEnabled(true);
holder.receiptRv.setAdapter(receiptsAdapter);
}
Любая помощь приветствуется!Дайте мне знать, если я должен опубликовать что-нибудь еще.~ Спасибо ~