Java 在for循环中使用时无法从改装中获取数据
我在使用MVVM,我在尝试循环一个整数列表,它有一些电影类型的id,我在使用改型,我有一个函数,它应该返回一个基于id的电影列表,但出于某种原因它工作 我试着将id传递给函数,它成功了,但是当我试图循环一个id列表以获得不同的结果并将它们放入一个RecyclerView时,它没有成功 主要活动:Java 在for循环中使用时无法从改装中获取数据,java,android,api,retrofit,Java,Android,Api,Retrofit,我在使用MVVM,我在尝试循环一个整数列表,它有一些电影类型的id,我在使用改型,我有一个函数,它应该返回一个基于id的电影列表,但出于某种原因它工作 我试着将id传递给函数,它成功了,但是当我试图循环一个id列表以获得不同的结果并将它们放入一个RecyclerView时,它没有成功 主要活动: public class MainActivity extends AppCompatActivity { RecyclerView mMainRecycler; MoviesVie
public class MainActivity extends AppCompatActivity {
RecyclerView mMainRecycler;
MoviesViewModel moviesViewModel;
MainRecyclerAdapter mainRecyclerAdapter;
Context context = this;
List<String> genresNames = new ArrayList<>();
List<Integer> genresIds = new ArrayList<>();
List<Movies.Result> listResults = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMainRecycler = findViewById(R.id.main_recycler);
mMainRecycler.setLayoutManager(new LinearLayoutManager(this));
moviesViewModel = new ViewModelProvider(this).get(MoviesViewModel.class);
moviesViewModel.getMoviesGenres();
moviesViewModel.mutableMoviesGenres.observe(this, new Observer<List<MoviesGenres.GenresBean>>() {
@Override
public void onChanged(List<MoviesGenres.GenresBean> genresBeans) {
for (int i = 0; i < genresBeans.size(); i++) {
genresIds.add(genresBeans.get(i).getId());
genresNames.add(genresBeans.get(i).getName());
}
mainRecyclerAdapter.addNames(genresNames);
}
});
for(int i = 0; i < genresIds.size(); i++) {
moviesViewModel.getMovieWithGenre(genresIds.get(i));
}
moviesViewModel.mutableMoviesWithGenre.observe(this, new Observer<List<Movies.Result>>() {
@Override
public void onChanged(List<Movies.Result> results) {
listResults.addAll(results);
mainRecyclerAdapter.addResults(listResults);
}
});
mMainRecycler.setLayoutManager(new LinearLayoutManager(this));
mainRecyclerAdapter = new MainRecyclerAdapter(context, genresNames, listResults);
mMainRecycler.setAdapter(mainRecyclerAdapter);
}
}
public类MainActivity扩展了AppCompatActivity{
回收车;
MoviesViewModel MoviesViewModel;
主回收适配器主回收适配器;
上下文=这个;
List genresNames=new ArrayList();
List genresIds=new ArrayList();
List listResults=新建ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMainRecycler=findViewById(R.id.main_回收商);
mMainRecycler.setLayoutManager(新的LinearLayoutManager(this));
moviesViewModel=newviewmodelprovider(this.get)(moviesViewModel.class);
moviesViewModel.getmoviesgeners();
moviesViewModel.mutablemoviesgeners.observe(这是一个新的观察者(){
@凌驾
更改后的公共void(列出genresBeans){
for(int i=0;i
视图模型:
public class MoviesViewModel extends ViewModel {
public MutableLiveData<List<Movies.Result>> mutablePopularMovies = new MutableLiveData<>();
public void getPopular(){
MoviesClient.getInstance().getPopular().enqueue(new Callback<Movies>() {
@Override
public void onResponse(@NonNull Call<Movies> call, @NonNull Response<Movies> response) {
if(response.isSuccessful() && response.body() != null) {
mutablePopularMovies.setValue(response.body().getResults());
}
}
@Override
public void onFailure(@NonNull Call<Movies> call, @NonNull Throwable t) {
t.printStackTrace();
}
});
}
public MutableLiveData<List<Movies.Result>> mutableMoviesWithGenre = new MutableLiveData<>();
public void getMovieWithGenre(int i){
MoviesClient.getInstance().getMoviesWithGenre(i).enqueue(new Callback<Movies>() {
@Override
public void onResponse(@NonNull Call<Movies> call, @NonNull Response<Movies> response) {
if(response.isSuccessful() && response.body() != null) {
mutableMoviesWithGenre.setValue(response.body().getResults());
}
}
@Override
public void onFailure(@NonNull Call<Movies> call, @NonNull Throwable t) {
t.printStackTrace();
}
});
}
public MutableLiveData<List<MoviesGenres.GenresBean>> mutableMoviesGenres = new MutableLiveData<>();
public void getMoviesGenres() {
MoviesClient.getInstance().getMoviesByGenre().enqueue(new Callback<MoviesGenres>() {
@Override
public void onResponse(@NonNull Call<MoviesGenres> call, @NonNull Response<MoviesGenres> response) {
if(response.isSuccessful() && response.body() != null) {
mutableMoviesGenres.setValue(response.body().getGenres());
}
}
@Override
public void onFailure(@NonNull Call<MoviesGenres> call, @NonNull Throwable t) {
t.printStackTrace();
}
});
}
}
公共类MoviesViewModel扩展了ViewModel{
public MutableLiveData mutablePopularMovies=新的MutableLiveData();
公共的{
MoviesClient.getInstance().getPopular().enqueue(新回调()函数){
@凌驾
public void onResponse(@NonNull调用,@NonNull响应){
if(response.issusccessful()&&response.body()!=null){
mutablePopularMovies.setValue(response.body().getResults());
}
}
@凌驾
public void onFailure(@NonNull Call Call,@NonNull Throwable t){
t、 printStackTrace();
}
});
}
public MutableLiveData mutableMoviesWithGenre=new MutableLiveData();
公共电影类型(int i){
MoviesClient.getInstance().getMovieswithGene(i).enqueue(新回调(){
@凌驾
public void onResponse(@NonNull调用,@NonNull响应){
if(response.issusccessful()&&response.body()!=null){
mutableMoviesWithGenre.setValue(response.body().getResults());
}
}
@凌驾
public void onFailure(@NonNull Call Call,@NonNull Throwable t){
t、 printStackTrace();
}
});
}
public MutableLiveData mutablemoviesgeners=new MutableLiveData();
公共无效GetMoviesTyres(){
MoviesClient.getInstance().getMoviesbyGene().enqueue(新回调(){
@凌驾
public void onResponse(@NonNull调用,@NonNull响应){
if(response.issusccessful()&&response.body()!=null){
setValue(response.body().getGenres());
}
}
@凌驾
public void onFailure(@NonNull Call Call,@NonNull Throwable t){
t、 printStackTrace();
}
});
}
}
Main RecycleServiceAdapter:
public class MainRecyclerAdapter extends RecyclerView.Adapter<MainRecyclerAdapter.MainViewHolder> {
private Context mContext;
private List<Movies.Result> moviesResults;
private List<String> moviesNames;
public MainRecyclerAdapter(Context context, List<String> moviesNames, List<Movies.Result> moviesResults) {
this.mContext = context;
this.moviesNames = moviesNames;
this.moviesResults = moviesResults;
}
@NonNull
@Override
public MainRecyclerAdapter.MainViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MainViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.category_rv_item, parent, false));
}
@Override
public void onBindViewHolder(@NonNull final MainRecyclerAdapter.MainViewHolder holder, int position) {
holder.genresTv.setText(moviesNames.get(position));
setCatItemRecycler(holder.mRecycler, moviesResults);
}
@Override
public int getItemCount() {
return moviesNames.size();
}
public void addNames(List<String> moviesGenres) {
moviesNames.addAll(moviesGenres);
notifyDataSetChanged();
}
public void addResults(List<Movies.Result> listResults) {
moviesResults.addAll(listResults);
notifyDataSetChanged();
}
public class MainViewHolder extends RecyclerView.ViewHolder {
TextView genresTv;
RecyclerView mRecycler;
public MainViewHolder(@NonNull View itemView) {
super(itemView);
genresTv = itemView.findViewById(R.id.cat_title);
mRecycler = itemView.findViewById(R.id.item_recycler);
}
}
private void setCatItemRecycler(RecyclerView recyclerView, List<Movies.Result> moviesResults){
MovieAdapter movieAdapter = new MovieAdapter(mContext, moviesResults);
recyclerView.setLayoutManager(new LinearLayoutManager(mContext, RecyclerView.HORIZONTAL, false));
recyclerView.setAdapter(movieAdapter);
}
}
公共类MainRecyclerAdapter扩展了RecyclerView.Adapter{
私有上下文;
私人名单电影结果;
私人名单电影名称;
公共MainRecyclerAdapter(上下文上下文、列表电影名称、列表电影结果){
this.mContext=上下文;
this.moviesNames=moviesNames;
this.moviesResults=moviesResults;
}
@非空
@凌驾
public MainRecyclerAdapter.MainViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
返回新的MainViewHolder(LayoutFlater.from(parent.getContext())。充气(R.layout.category_rv_item,parent,false));
}
@凌驾
BindViewHolder上的公共无效(@NonNull final MainRecyclerAdapter.MainViewHolder,int位置){
holder.genresTv.setText(moviesNames.get(position));
setCatItemRecycler(holder.mRecycler,moviesResults);
}
@凌驾
public int getItemCount(){
返回moviesNames.size();
}
public void addNames(列出电影类型){
moviesNames.addAll(电影类型);
notifyDataSetChanged();
}
public void addResults(列表结果){
moviesResults.addAll(列表结果);
notifyDataSetChanged();
}
公共类MainViewHolder扩展了RecyclerView.ViewHolder{
TextView-genresTv;
回收器查看循环器;
public MainViewHolder(@NonNull View itemView){
超级(项目视图);
genresTv=itemView.findviewbyd(R.id.cat_title);
mRecycler=itemView.findviewbyd(R.id.item\u recycler);
}
}
私有void setCatItemRecycler(
public class MovieAdapter extends RecyclerView.Adapter<MovieAdapter.MovieViewHolder> {
private List<Movies.Result> moviesResult;
private Context mContext;
public MovieAdapter(Context context, List<Movies.Result> moviesResult) {
this.moviesResult = moviesResult;
this.mContext = context;
}
@NonNull
@Override
public MovieAdapter.MovieViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MovieViewHolder(LayoutInflater.from(mContext).inflate(R.layout.movie_item, parent, false));
}
@Override
public void onBindViewHolder(@NonNull MovieAdapter.MovieViewHolder holder, int position) {
String imageUrl = MoviesClient.IMAGE_URL + moviesResult.get(position).getPosterPath();
Glide.with(holder.mPosterImage.getContext()).load(imageUrl).into(holder.mPosterImage);
}
@Override
public int getItemCount() {
return moviesResult.size();
}
public class MovieViewHolder extends RecyclerView.ViewHolder {
ImageView mPosterImage;
public MovieViewHolder(@NonNull View itemView) {
super(itemView);
mPosterImage = itemView.findViewById(R.id.poster_image);
}
}
}
public void updateGenres(List<Genres> genres){
listResults.addAll(genres);
this.notifyDataSetChanged();
}