Здесь я заметил, что вы храните массив ViewModels. Главное, что ViewModels не предназначены для такого использования.
Я думаю, что лучше, если вы прочитаете некоторую документацию и примеры реализаций ViewModels, чтобы лучше понять.
ComingВ вашей реализации все выглядит хорошо, но одна вещь, которая преобразует ваш список MovieSearch
в список MyListViewModel
.
В ViewModel
public class MyListViewModel extends ViewModel {
private MutableLiveData<MovieSearch> mutableLiveData = new MutableLiveData<>();
@BindingAdapter({"imageUrl"})
public static void loadimage(ImageView imageView, String imageUrl) {
Glide.with(imageView.getContext()).load(imageUrl).apply(RequestOptions.circleCropTransform()).into(imageView);
//Picasso.with(imageView.getContext()).load(imageUrl).into(imageView);
}
public LiveData<MovieSearch> getMutableLiveData() {
loadData();
return mutableLiveData;
}
private void loadData(){
MyApi api = MyClient.getInstance().getMyApi();
Call<MovieSearch> call = api.getartistdata();
call.enqueue(new Callback<MovieSearch>() {
@Override
public void onResponse(Call<MovieSearch> call, Response<MovieSearch> response) {
MovieSearch movieSearch = response.body();
mutableLiveData.setValue(myList);
}
@Override
public void onFailure(Call<ArrayList<MovieSearch>> call, Throwable t) {
}
});
}
}
В упражнении или фрагменте вы можете получить доступ к liveData через getMutableLiveData()
и установить List<MovieSearch>
для адаптера.
Еще одна вещь, учитывая ваш ответ JSON, ваш API должен выглядеть ниже
public interface MyApi {
@GET("/movies")
Call<MovieSearch> getartistdata();
}
MovieSearch
отсутствует в списке
Адаптер
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private ArrayList<Search> arrayList = new ArrayList<>;
private LayoutInflater layoutInflater;
public void submitList(ArrayList<Search> searchList){
this.arrayList = searchList;
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (layoutInflater==null){
layoutInflater=LayoutInflater.from(parent.getContext());
}
MyListBinding myListBinding= DataBindingUtil.inflate(layoutInflater, R.layout.mylist,parent,false);
return new ViewHolder(myListBinding);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Search search =arrayList.get(position);
holder.bind(search);
}
@Override
public int getItemCount() {
return arrayList.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
private MyListBinding myListBinding;
public ViewHolder(@NonNull MyListBinding myListBinding) {
super(myListBinding.getRoot());
this.myListBinding=myListBinding;
}
public void bind(Search myli){
this.myListBinding.setMylistmodel(myli);
myListBinding.executePendingBindings();
}
public MyListBinding getMyListBinding(){
return myListBinding;
}
}
}
Активность
adapter = MyAdapter();
recyclerview=(RecyclerView)findViewById(R.id.recyclerView);
recyclerview.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
recyclerview.setAdapter(adapter);
myListViewModel = ViewModelProviders.of(this).get(MyListViewModel.class);
myListViewModel.getSearchResults().observe(this, new Observer<MovieSearch>() {
@Override
public void onChanged(@Nullable MovieSearch movieSearch) {
// handle changes here, to use the data write code below
adapter.submitList(movieSearch.Search);
}
});
И еще одна маленькая вещь, пожалуйста, не начинайте имена переменных с заглавных букв. Лучше следовать соглашениям об именах с самого начала.