Сохранить выбранный спиннер в Android Room - PullRequest
0 голосов
/ 25 декабря 2018

Я пытаюсь сохранить выбор счетчика в Базе данных комнаты Android, но каждый раз, когда я запускаю код, слушатель spinner onSelect продолжает зацикливаться.Спиннер - это отдельная карта, созданная видом переработчика.Каждая карта не может быть нажата, и счетчик не может изменить свое значение, поскольку он работает в этом цикле.Я просто пытаюсь выбрать элемент из счетчика, а затем обновить его в базе данных.

СПИСОК СПИННЕРА

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 голосов
/ 25 декабря 2018

Я не уверен, почему Ваш AsyncTask не работает и вызывает бесконечный цикл.Я не думаю, что вы должны использовать его в первую очередь, особенно в 2018 году, когда у вас есть RxJava:)

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

...