我试图将微调器选择保存到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" />
很乐意提供更多信息! 感谢任何帮助!
欢呼
答案 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。希望对您有帮助。