ViewModelFactory, заполнение родительского и дочернего списка, неправильная сортировка - PullRequest
0 голосов
/ 01 февраля 2019

Я работаю над приложением, которое позволяет пользователю сделать снимок чека и сохранить его в категории расходов.В данный момент пользователь должен создать список категорий, а затем щелкнуть по значку, чтобы ввести квитанцию.Внутри этого 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);
}

Любая помощь приветствуется!Дайте мне знать, если я должен опубликовать что-нибудь еще.~ Спасибо ~

...