Android Room - Отношения и LiveData - PullRequest
       58

Android Room - Отношения и LiveData

0 голосов
/ 19 сентября 2018

У меня есть класс Lure, который содержит ArrayList класса LureImage, как показано в коде ниже.В моем хранилище я делаю вызов базы данных, чтобы получить LiveData<List<Lure>>, а затем я выполняю AsyncTask, чтобы получить List<LureImage> для каждой приманки.Проблема с кодом, который я написал для этого, заключается в том, что он не всегда получает List<LureImage> из базы данных, и в результате иногда мой RecyclerView показывает изображения, а иногда нет.(я показываю скриншоты того, что я имею в виду ниже)

public class Lure implements Serializable {

    private static final String TAG = "LURE";

    @PrimaryKey(autoGenerate = true)
    private int id;
    private String _lureName;
    private String _lureNotes;

    @Ignore
    private List<LureImage> lureImages = new ArrayList<>();

    public Lure() {

    }

    @Ignore
    public Lure(String lureName, String lureNotes) {
        this._lureName = lureName;
        this._lureNotes = lureNotes;
    }
}

Из моего класса LureRepository мне удается получить LiveData> из базы данных, а затем я хочу, чтобы каждая приманка получила свой соответствующий класс изображений из базы данных.Мне удалось сделать это, используя этот метод.

public LiveData<List<Lure>> getAllLures() {
        LiveData<List<Lure>> luresLiveData = lureDao.getAllLures();
        luresLiveData = Transformations.map(luresLiveData, new Function<List<Lure>, List<Lure>>() {
            @Override
            public List<Lure> apply(List<Lure> input) {
                for (final Lure lure : input) {
                    new GetLureImagesTask(lureDao).execute(lure);
                }
                return input;
            }
        });
        return luresLiveData;
    }

private static class GetLureImagesTask extends AsyncTask<Lure,Void,Void> {
        private LureDao lureDao;

        public GetLureImagesTask(LureDao lureDao) {
            this.lureDao = lureDao;
        }

        @Override
        protected Void doInBackground(Lure... lures) {
            lures[0].setLureImages(lureDao.getLureImages(lures[0].getId()));
            return null;
 }
    }

Здесь я получаю изображения и отображаю их в виде переработчика Здесь изображения не получены enter image description here

1 Ответ

0 голосов
/ 19 сентября 2018

Получить изображения в адаптере.

    class YourAdapter() : RecyclerView.Adapter<Recyclerview.ViewHolder>() {

          override fun onBindViewHolder(holder: ViewHolder, position: Int) {
                   // place your asynctask here
          }
    }

Надеюсь, это поможет.Дайте мне знать

...