将微调框选中的项目保存到Android Room

时间:2018-12-25 14:43:30

标签: android android-spinner android-room selecteditem

我试图将微调器选择保存到Android Room数据库,但是每次运行代码时,微调器onSelect侦听器都会陷入无限循环。微调框是卡片的一部分,由回收者视图生成。由于在此循环中运行,因此无法单击每个卡,并且微调框也无法更改其值。我只是想从微调器中选择一个项目,然后在数据库中对其进行更新。

SPINNER LISTENER

holder.itemQuantity.setOnItemSelectedListener(new 
AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, 
int spinnerPosition, long id) {
cartViewModel.updateQuantity(cartItems.get(position), holder.itemQuantity.getSelectedItemPosition() + 1);

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

存储库代码

public void updateQuantity(CartItem cartItem, int quan){
    new updateQuantityAsyncTask(mCartItemDao, quan).execute(cartItem);
}

private static class updateQuantityAsyncTask extends AsyncTask<CartItem, Void, Void>{
    private CartItemDao mAsyncCartDao;
    private int quan;

    updateQuantityAsyncTask(CartItemDao cartItemDao, int quan){
        mAsyncCartDao = cartItemDao;
        this.quan = quan;
    }

    @Override
    protected Void doInBackground(final CartItem... params){
        mAsyncCartDao.updateQuantity(params[0].getItemID(),quan);

        return null;
    }
}

DAO代码

@Query("UPDATE CART_TABLE SET quantity = :quan WHERE itemID = :id ")
void updateQuantity(int id, int quan);

查看型号代码

public void updateQuantity(CartItem cartItem, int quantity){
    cartRepository.updateQuantity(cartItem,quantity);
}

SPINNER XML

<Spinner
        android:id="@+id/cartCardSpinner"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="@+id/guideline13"
        app:layout_constraintTop_toTopOf="@+id/guideline15" />

很乐意提供更多信息! 感谢任何帮助!

欢呼

1 个答案:

答案 0 :(得分:1)

我不确定为什么您的AsyncTask无法正常工作并导致无限循环。我不认为您应该首先使用它,尤其是当您拥有RxJava时不要在2018年使用它:)

首先,将RxJava和RxAndroid添加到您的项目

implementation "io.reactivex.rxjava2:rxjava:2.1.13"
implementation "io.reactivex.rxjava2:rxandroid:2.0.2"

您的ViewModel代码

public void updateQuantity(CartItem cartItem, int quantity){
      val updatedCartItem = //todo update cartItem quantity here
      addDisposable(cartRepository.updateQuantity(updatedCartItem))
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnError { handleFailure(it) }
            .subscribe { processResponse(it) })
}

private val compositeDisposable: CompositeDisposable = CompositeDisposable()

fun addDisposable(disposable: Disposable) {
    compositeDisposable.add(disposable)
}

您的Repository代码

fun updateQuantity(cartItem: CartItem): Single<Int> {
    return mAsyncCartDao.updateQuantity(cartItem)
}

您的Dao代码

interface Dao {

@Update(onConflict = OnConflictStrategy.REPLACE)
     fun updateQuantity(item: CartItem): Single<Int>

}

我用kotlin编写了这段代码,因为我在Android开发中不再使用Java。希望对您有帮助。