Адаптер RecylcerView с данными ViewModel и Live - PullRequest
0 голосов
/ 29 августа 2018

Я начинаю использовать компоненты Android Jetpack Arch и столкнулся с некоторой путаницей. Также обратите внимание, что привязка данных невозможна.

У меня есть активность с RecylcerView. У меня есть ViewModel, которая выглядит следующим образом

public class Movie extends ViewModel {


public Movie movie;
public URL logoURL;

private MutableLiveData<Drawable> logo;

public MutableLiveData<Drawable> getLogo() {

    if (logo == null) {
        logo = new MutableLiveData<>();
    }
    return logo;
}


public PikTvChannelItemVM(Movie movie, URL logo) {

    this.movie = movie;
    this.logoURL = logoURL;


}

public Bitmap getChannelLogo() {

  //Do some network call to get the bitmap logo from the url
 }

}

Выше все в порядке, хотя в моем обзоре я имею следующий код ниже. Хотя в onbindviewholder, когда я пытаюсь наблюдать за возвращенным изображением из живых данных viewmodels, ему нужна ссылка на владельца жизненного цикла, которой у меня нет в моем представлении переработчика. Пожалуйста, помогите спасибо

public class MovieRecyclerViewAdapter extends RecyclerView
    .Adapter<MovieRecyclerViewAdapter.MovieItemViewHolder> {

public List<MovieViewModel> vmList;


public MovieRecyclerViewAdapter(List<MovieViewModel> vmList) {

    this.vmList = vmList;
    setHasStableIds(true);
}

@Override
public MovieItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    MovieView itemView = new MovieView(parent.getContext(), null);
    itemView.setLayoutParams(new ViewGroup.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.WRAP_CONTENT
    ));
    return new MovieItemViewHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull MovieItemViewHolder holder, int position) {


    vmList.get(position).observe(?????, users -> {

  // As you can see I have no reference to the life cycle owner
       holder.imageView.setimage(some drawable returned by the View Model)
    });
}


@Override
public long getItemId(int position) {

    return position;
}

@Override
public int getItemViewType(int position) {

    return position;
}


@Override
public int getItemCount() {

    return vmList.size();
}

class MovieItemViewHolder extends RecyclerView.ViewHolder {

    private MovieView channelView;

    public MovieItemViewHolder(View v) {

        super(v);
        channelView = (MovieView) v;
    }

    public MovieView getChannelView() {

        return channelView;
    }
 }

}

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Ваш тип списка адаптеров не должен быть viewmodel. Если вы хотите использовать живые данные без привязки, вы хотите автоматически изменять интерфейс при обновлении списка.

Вы можете сделать это так:

Прежде всего, ваш класс фильма должен быть классом модели, а не моделью представления.

Делай это адаптер как обычно. Просто добавьте setList(Movie) метод. Этот метод должен обновить список адаптеров. Не забудьте уведомить адаптер после обновления списка.

Затем создайте список liveata, как

MutableLiveData<List<Movie>> movieLiveData = 
    new MutableLiveData<>();

где вы хотите.

Обратите внимание на этот список в методе действия и вызовите адаптеры метода setList (Movie) внутри наблюдать {}.

После всего этого, если ваш список обновлен, setList(Movie) medhod будет запущен, тогда ваш пользовательский интерфейс будет обновлен.

0 голосов
/ 07 ноября 2018

Я бы попытался отправить список адаптеру для его отображения. Я бы наблюдал данные за пределами адаптера, поскольку адаптер не обязан наблюдать за данными, а скорее отображать их.

...