Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用单个适配器在回收器视图中加载不同的布局_Android_Android Recyclerview - Fatal编程技术网

Android 如何使用单个适配器在回收器视图中加载不同的布局

Android 如何使用单个适配器在回收器视图中加载不同的布局,android,android-recyclerview,Android,Android Recyclerview,感谢您抽出时间阅读我的问题。 我一直在一个项目中工作,我必须在recyclerView中加载许多布局 待详细说明,回收者列表视图将包含 ----电影布局---(顶部) ----影院布局---(电影布局下方) ----大片---(剧院布局下方) 我就这样设计的, 具有回收器视图的活动 通用适配器 三个Pojo类 三种布局 我使用的代码 我的Pojo(所有三个Pojo的设计都一样) 我的RecyclerView适配器 public class MoviesAdapter extends Re

感谢您抽出时间阅读我的问题。 我一直在一个项目中工作,我必须在recyclerView中加载许多布局

待详细说明,回收者列表视图将包含

  • ----电影布局---(顶部)
  • ----影院布局---(电影布局下方)
  • ----大片---(剧院布局下方)
我就这样设计的,

  • 具有回收器视图的活动
  • 通用适配器
  • 三个Pojo类
  • 三种布局
我使用的代码

我的Pojo(所有三个Pojo的设计都一样)

我的RecyclerView适配器

public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.MyViewHolder> {

    private List<Movie> moviesList;
    private List<Movie1> moviesList1;

    final int Movie = 0, Movie1 = 1;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView title, year, genre;

        public MyViewHolder(View view, int viewType) {
            super(view);
            title = (TextView) view.findViewById(R.id.title);
            genre = (TextView) view.findViewById(R.id.genre);
            year = (TextView) view.findViewById(R.id.year);
        }
    }

    public class MyViewHolder2 extends RecyclerView.ViewHolder {
        public TextView title, year, genre;

        public MyViewHolder2(View view, int Viewtype) {
            super(view);
            title = (TextView) view.findViewById(R.id.title);
            genre = (TextView) view.findViewById(R.id.genre);
            year = (TextView) view.findViewById(R.id.year);
        }


    }

    @Override
    public int getItemViewType(int position) {

        if (moviesList.get(position) instanceof Movie) {
            return Movie;
        } else if (moviesList1.get(position) instanceof Movie1) {
            return Movie1;
        }
        return -1;
    }

    public MoviesAdapter(List<Movie> moviesList, List<Movie1> moviesList1) {
        this.moviesList = moviesList;
        this.moviesList1 = moviesList1;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v;
        MyViewHolder vh = null;

        // create a new view
        switch (viewType) {
            case Movie: //This would be the header view in my Recycler
                System.out.println("This is movie");
                v = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.movie_list_row, parent, false);
                vh = new MyViewHolder(v, viewType);
                return vh;

            case Movie1: //This would be the header view in my Recycler
                System.out.println("This is movie1");
                v = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.movie_row, parent, false);
                vh = new MyViewHolder(v, viewType);
                return vh;

            default: //This would be the normal list with the pictures of the places in the world
                return vh;
        }
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
       /* if (position == 0) {
            Movie movie = moviesList.get(position);
            holder.title.setText(movie.getTitle());
            holder.genre.setText(movie.getTitle());
            holder.year.setText(movie.getTitle());
            //this means it is beyond the headerview now as it is no longer 0. For testing purposes, I'm alternating between two pics for now
        } else if (position == 1) {
            Movie1 movie = moviesList1.get(position);
            holder.title.setText(movie.getTitle());
            holder.genre.setText(movie.getGenre());
            holder.year.setText(movie.getYear());

        }*/

        switch (holder.getItemViewType()) {
            case Movie:
                MyViewHolder vh1 = (MyViewHolder) holder;
                Movie movie = (Movie) moviesList.get(position);
                vh1.title.setText(movie.getTitle());
                vh1.genre.setText(movie.getGenre());
                vh1.year.setText(movie.getYear());

                break;
            case Movie1:
                MyViewHolder vh2 = (MyViewHolder) holder;
                Movie1 movie1=(Movie1)moviesList1.get(position);
                vh2.title.setText(movie1.getTitle());
                vh2.year.setText(movie1.getYear());
                vh2.genre.setText(movie1.getGenre());

                break;
            default:
                break;
        }

    }

    @Override
    public int getItemCount() {
        return moviesList.size();
    }
public class ComplexRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    // The items to display in your RecyclerView
    private List<Object> items;

    private final int MOVIE= 0,THEATERS=1 , BLOCKBUSTER = 2;

    // Provide a suitable constructor (depends on the kind of dataset)
    public ComplexRecyclerViewAdapter(List<Object> items) {
        this.items = items;
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return this.items.size();
    }

    @Override
    public int getItemViewType(int position) {
           if (items.get(position) instanceof Movie) {
               return MOVIE;
         } else if (items.get(position) instanceof Theatrs ) {
               return THEATERS;
         }else if (items.get(position) instanceof Blockbuster ) {
               return BLOCKBUSTER ;
      }
         return -1;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup   viewGroup, int viewType) {
              RecyclerView.ViewHolder viewHolder;
  LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());

  switch (viewType) {
      case MOVIE:
          View v1 = inflater.inflate(R.layout.movie_viewholder, viewGroup, false);
          viewHolder = new ViewHolder1(v1);
          break;
      case THEATERS:
          View v2 = inflater.inflate(R.layout.theater_viewholder2, viewGroup, false);
          viewHolder = new ViewHolder2(v2);
          break;

      case BLOCKBUSTER :
          View v3 = inflater.inflate(R.layout.layout_blockbuster, viewGroup, false);
          viewHolder = new ViewHolder3(v3);
          break;
      default:
          View v = inflater.inflate(android.R.layout.simple_list_item_1, viewGroup, false);
          viewHolder = new RecyclerViewSimpleTextViewHolder(v);
          break;
  }
  return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
               switch (viewHolder.getItemViewType()) {
      case MOVIE:
          ViewHolder1 vh1 = (ViewHolder1) viewHolder;
          configureViewHolder1(vh1, position);
          break;
      case THEATERS:
          ViewHolder2 vh2 = (ViewHolder2) viewHolder;
          configureViewHolder2(vh2, position);
          break;

      case BLOCKBUSTER :
          ViewHolder3 vh3 = (ViewHolder3) viewHolder;
          configureViewHolder3(vh3, position);
          break;
      default:
          RecyclerViewSimpleTextViewHolder vh = (RecyclerViewSimpleTextViewHolder) viewHolder;
          configureDefaultViewHolder(vh, position);
          break;
  }
    }
}
和prepareMovieData()方法代码

private void prepareMovieData() {
        Movie movie = new Movie("Mad Max: Fury Road", "Action & Adventure", "2015");
        movieList.add(movie);

        movie = new Movie("Inside Out", "Animation, Kids & Family", "2015");
        movieList.add(movie);

        movie = new Movie("Star Wars: Episode VII - The Force Awakens", "Action", "2015");
        movieList.add(movie);

        movie = new Movie("Shaun the Sheep", "Animation", "2015");
        movieList.add(movie);}
运行程序后,仅在“我的回收器”视图中加载第一个布局。任何帮助都会对我学习这些东西大有帮助


谢谢

首先检查正常布局,然后检查内容是否正确连接,或者没有看到布局的xml代码

我的主要怀疑是getItemCount()方法,您只返回一个列表的计数,我在recyclerview中看到了许多其他多个布局的实现,其中大多数使用单个列表,并将一些字段设置为null,在onBindviewholder中仅检索特定布局所需的字段,希望这有所帮助

 List<CityEvent> list = new ArrayList<>();
    list.add(new CityEvent("London", null, CityEvent.CITY_TYPE));
    list.add(new CityEvent("Droidcon", "Droidcon in London", CityEvent.EVENT_TYPE));
    list.add(new CityEvent("Some event", "Some event in London", CityEvent.EVENT_TYPE));
    list.add(new CityEvent("Amsterdam", null, CityEvent.CITY_TYPE));
    list.add(new CityEvent("Droidcon", "Droidcon in Amsterdam", CityEvent.EVENT_TYPE));
    list.add(new CityEvent("Berlin", null, CityEvent.CITY_TYPE));
    list.add(new CityEvent("Droidcon", "Droidcon in Berlin", CityEvent.EVENT_TYPE));

 @Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    CityEvent object = mList.get(position);
    if (object != null) {
        switch (object.getType()) {
            case CITY_TYPE:
                ((CityViewHolder) holder).mTitle.setText(object.getName());
                break;
            case EVENT_TYPE:
                ((EventViewHolder) holder).mTitle.setText(object.getName());
                ((EventViewHolder) holder).mDescription.setText(object.getDescription());
                break;
        }
    }
}
@Override
public int getItemCount() {
    if (mList == null)
        return 0;
    return mList.size();
}
List List=new ArrayList();
添加(新CityEvent(“伦敦”,空,CityEvent.CITY_类型));
添加(新的CityEvent(“Droidcon”,“伦敦Droidcon”,CityEvent.EVENT_类型));
添加(新的CityEvent(“某些事件”,“伦敦的某些事件”,CityEvent.event_类型));
添加(新CityEvent(“阿姆斯特丹”,空,CityEvent.CITY_类型));
添加(新CityEvent(“Droidcon”,“阿姆斯特丹Droidcon”,CityEvent.EVENT_类型));
添加(新CityEvent(“Berlin”,null,CityEvent.CITY_TYPE));
添加(新CityEvent(“Droidcon”,“柏林Droidcon”,CityEvent.EVENT_类型));
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
CityEvent对象=mList.get(位置);
if(对象!=null){
开关(object.getType()){
案例城市类型:
((CityViewHolder)holder.mTitle.setText(object.getName());
打破
案例事件类型:
((EventViewHolder)holder.mTitle.setText(object.getName());
((EventViewHolder)holder.mDescription.setText(object.getDescription());
打破
}
}
}
@凌驾
public int getItemCount(){
if(mList==null)
返回0;
返回mList.size();
}

首先检查正常布局,然后检查所有内容是否正确连接,或者看不到布局的xml代码

我的主要怀疑是getItemCount()方法,您只返回一个列表的计数,我在recyclerview中看到了许多其他多个布局的实现,其中大多数使用单个列表,并将一些字段设置为null,在onBindviewholder中仅检索特定布局所需的字段,希望这有所帮助

 List<CityEvent> list = new ArrayList<>();
    list.add(new CityEvent("London", null, CityEvent.CITY_TYPE));
    list.add(new CityEvent("Droidcon", "Droidcon in London", CityEvent.EVENT_TYPE));
    list.add(new CityEvent("Some event", "Some event in London", CityEvent.EVENT_TYPE));
    list.add(new CityEvent("Amsterdam", null, CityEvent.CITY_TYPE));
    list.add(new CityEvent("Droidcon", "Droidcon in Amsterdam", CityEvent.EVENT_TYPE));
    list.add(new CityEvent("Berlin", null, CityEvent.CITY_TYPE));
    list.add(new CityEvent("Droidcon", "Droidcon in Berlin", CityEvent.EVENT_TYPE));

 @Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    CityEvent object = mList.get(position);
    if (object != null) {
        switch (object.getType()) {
            case CITY_TYPE:
                ((CityViewHolder) holder).mTitle.setText(object.getName());
                break;
            case EVENT_TYPE:
                ((EventViewHolder) holder).mTitle.setText(object.getName());
                ((EventViewHolder) holder).mDescription.setText(object.getDescription());
                break;
        }
    }
}
@Override
public int getItemCount() {
    if (mList == null)
        return 0;
    return mList.size();
}
List List=new ArrayList();
添加(新CityEvent(“伦敦”,空,CityEvent.CITY_类型));
添加(新的CityEvent(“Droidcon”,“伦敦Droidcon”,CityEvent.EVENT_类型));
添加(新的CityEvent(“某些事件”,“伦敦的某些事件”,CityEvent.event_类型));
添加(新CityEvent(“阿姆斯特丹”,空,CityEvent.CITY_类型));
添加(新CityEvent(“Droidcon”,“阿姆斯特丹Droidcon”,CityEvent.EVENT_类型));
添加(新CityEvent(“Berlin”,null,CityEvent.CITY_TYPE));
添加(新CityEvent(“Droidcon”,“柏林Droidcon”,CityEvent.EVENT_类型));
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
CityEvent对象=mList.get(位置);
if(对象!=null){
开关(object.getType()){
案例城市类型:
((CityViewHolder)holder.mTitle.setText(object.getName());
打破
案例事件类型:
((EventViewHolder)holder.mTitle.setText(object.getName());
((EventViewHolder)holder.mDescription.setText(object.getDescription());
打破
}
}
}
@凌驾
public int getItemCount(){
if(mList==null)
返回0;
返回mList.size();
}

用更复杂的
回收服务适配器替换
SimpleItemRecycleServiceAdapter
,它可以根据项目视图类型对不同类型的布局进行调整。 例如,
RecycleServiceActivity
需要包含一个对象列表,如下所示:

private ArrayList<Object> getSampleArrayList() {
      ArrayList<Object> items = new ArrayList<>();
      items.add(new Movie ("Mad Max: Fury Road", "Action & Adventure", "2015"));
      items.add(new Theatres ("Something", "something"));
      items.add(new Blockbuster ("Something else", "Something else"));
      return items;
  }
等等

之后,您需要创建ComplexRecycleServiceAdapter

public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.MyViewHolder> {

    private List<Movie> moviesList;
    private List<Movie1> moviesList1;

    final int Movie = 0, Movie1 = 1;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView title, year, genre;

        public MyViewHolder(View view, int viewType) {
            super(view);
            title = (TextView) view.findViewById(R.id.title);
            genre = (TextView) view.findViewById(R.id.genre);
            year = (TextView) view.findViewById(R.id.year);
        }
    }

    public class MyViewHolder2 extends RecyclerView.ViewHolder {
        public TextView title, year, genre;

        public MyViewHolder2(View view, int Viewtype) {
            super(view);
            title = (TextView) view.findViewById(R.id.title);
            genre = (TextView) view.findViewById(R.id.genre);
            year = (TextView) view.findViewById(R.id.year);
        }


    }

    @Override
    public int getItemViewType(int position) {

        if (moviesList.get(position) instanceof Movie) {
            return Movie;
        } else if (moviesList1.get(position) instanceof Movie1) {
            return Movie1;
        }
        return -1;
    }

    public MoviesAdapter(List<Movie> moviesList, List<Movie1> moviesList1) {
        this.moviesList = moviesList;
        this.moviesList1 = moviesList1;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v;
        MyViewHolder vh = null;

        // create a new view
        switch (viewType) {
            case Movie: //This would be the header view in my Recycler
                System.out.println("This is movie");
                v = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.movie_list_row, parent, false);
                vh = new MyViewHolder(v, viewType);
                return vh;

            case Movie1: //This would be the header view in my Recycler
                System.out.println("This is movie1");
                v = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.movie_row, parent, false);
                vh = new MyViewHolder(v, viewType);
                return vh;

            default: //This would be the normal list with the pictures of the places in the world
                return vh;
        }
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
       /* if (position == 0) {
            Movie movie = moviesList.get(position);
            holder.title.setText(movie.getTitle());
            holder.genre.setText(movie.getTitle());
            holder.year.setText(movie.getTitle());
            //this means it is beyond the headerview now as it is no longer 0. For testing purposes, I'm alternating between two pics for now
        } else if (position == 1) {
            Movie1 movie = moviesList1.get(position);
            holder.title.setText(movie.getTitle());
            holder.genre.setText(movie.getGenre());
            holder.year.setText(movie.getYear());

        }*/

        switch (holder.getItemViewType()) {
            case Movie:
                MyViewHolder vh1 = (MyViewHolder) holder;
                Movie movie = (Movie) moviesList.get(position);
                vh1.title.setText(movie.getTitle());
                vh1.genre.setText(movie.getGenre());
                vh1.year.setText(movie.getYear());

                break;
            case Movie1:
                MyViewHolder vh2 = (MyViewHolder) holder;
                Movie1 movie1=(Movie1)moviesList1.get(position);
                vh2.title.setText(movie1.getTitle());
                vh2.year.setText(movie1.getYear());
                vh2.genre.setText(movie1.getGenre());

                break;
            default:
                break;
        }

    }

    @Override
    public int getItemCount() {
        return moviesList.size();
    }
public class ComplexRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    // The items to display in your RecyclerView
    private List<Object> items;

    private final int MOVIE= 0,THEATERS=1 , BLOCKBUSTER = 2;

    // Provide a suitable constructor (depends on the kind of dataset)
    public ComplexRecyclerViewAdapter(List<Object> items) {
        this.items = items;
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return this.items.size();
    }

    @Override
    public int getItemViewType(int position) {
           if (items.get(position) instanceof Movie) {
               return MOVIE;
         } else if (items.get(position) instanceof Theatrs ) {
               return THEATERS;
         }else if (items.get(position) instanceof Blockbuster ) {
               return BLOCKBUSTER ;
      }
         return -1;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup   viewGroup, int viewType) {
              RecyclerView.ViewHolder viewHolder;
  LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());

  switch (viewType) {
      case MOVIE:
          View v1 = inflater.inflate(R.layout.movie_viewholder, viewGroup, false);
          viewHolder = new ViewHolder1(v1);
          break;
      case THEATERS:
          View v2 = inflater.inflate(R.layout.theater_viewholder2, viewGroup, false);
          viewHolder = new ViewHolder2(v2);
          break;

      case BLOCKBUSTER :
          View v3 = inflater.inflate(R.layout.layout_blockbuster, viewGroup, false);
          viewHolder = new ViewHolder3(v3);
          break;
      default:
          View v = inflater.inflate(android.R.layout.simple_list_item_1, viewGroup, false);
          viewHolder = new RecyclerViewSimpleTextViewHolder(v);
          break;
  }
  return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
               switch (viewHolder.getItemViewType()) {
      case MOVIE:
          ViewHolder1 vh1 = (ViewHolder1) viewHolder;
          configureViewHolder1(vh1, position);
          break;
      case THEATERS:
          ViewHolder2 vh2 = (ViewHolder2) viewHolder;
          configureViewHolder2(vh2, position);
          break;

      case BLOCKBUSTER :
          ViewHolder3 vh3 = (ViewHolder3) viewHolder;
          configureViewHolder3(vh3, position);
          break;
      default:
          RecyclerViewSimpleTextViewHolder vh = (RecyclerViewSimpleTextViewHolder) viewHolder;
          configureDefaultViewHolder(vh, position);
          break;
  }
    }
}
运行程序之前的最后一个重要更改是将
RecycleServiceActivity
中的
bindDataToAdapter
方法更改为设置
ComplexRecycleServiceAdapter
而不是
SimpleItemRecycleServiceAdapter
,如下所示:

  private void bindDataToAdapter() {
      // Bind adapter to recycler view object
      recyclerView.setAdapter(new ComplexRecyclerViewAdapter(getSampleArrayList()));
  }

将SimpleItemRecycleWebAdapter替换为更复杂的ComplexRecycleWebAdapter
,它完成了根据项目视图类型展开不同类型布局的所有繁重工作。 例如,
RecycleServiceActivity
需要包含一个对象列表,如下所示:

private ArrayList<Object> getSampleArrayList() {
      ArrayList<Object> items = new ArrayList<>();
      items.add(new Movie ("Mad Max: Fury Road", "Action & Adventure", "2015"));
      items.add(new Theatres ("Something", "something"));
      items.add(new Blockbuster ("Something else", "Something else"));
      return items;
  }
等等

之后,您需要创建ComplexRecycleServiceAdapter

public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.MyViewHolder> {

    private List<Movie> moviesList;
    private List<Movie1> moviesList1;

    final int Movie = 0, Movie1 = 1;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView title, year, genre;

        public MyViewHolder(View view, int viewType) {
            super(view);
            title = (TextView) view.findViewById(R.id.title);
            genre = (TextView) view.findViewById(R.id.genre);
            year = (TextView) view.findViewById(R.id.year);
        }
    }

    public class MyViewHolder2 extends RecyclerView.ViewHolder {
        public TextView title, year, genre;

        public MyViewHolder2(View view, int Viewtype) {
            super(view);
            title = (TextView) view.findViewById(R.id.title);
            genre = (TextView) view.findViewById(R.id.genre);
            year = (TextView) view.findViewById(R.id.year);
        }


    }

    @Override
    public int getItemViewType(int position) {

        if (moviesList.get(position) instanceof Movie) {
            return Movie;
        } else if (moviesList1.get(position) instanceof Movie1) {
            return Movie1;
        }
        return -1;
    }

    public MoviesAdapter(List<Movie> moviesList, List<Movie1> moviesList1) {
        this.moviesList = moviesList;
        this.moviesList1 = moviesList1;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v;
        MyViewHolder vh = null;

        // create a new view
        switch (viewType) {
            case Movie: //This would be the header view in my Recycler
                System.out.println("This is movie");
                v = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.movie_list_row, parent, false);
                vh = new MyViewHolder(v, viewType);
                return vh;

            case Movie1: //This would be the header view in my Recycler
                System.out.println("This is movie1");
                v = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.movie_row, parent, false);
                vh = new MyViewHolder(v, viewType);
                return vh;

            default: //This would be the normal list with the pictures of the places in the world
                return vh;
        }
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
       /* if (position == 0) {
            Movie movie = moviesList.get(position);
            holder.title.setText(movie.getTitle());
            holder.genre.setText(movie.getTitle());
            holder.year.setText(movie.getTitle());
            //this means it is beyond the headerview now as it is no longer 0. For testing purposes, I'm alternating between two pics for now
        } else if (position == 1) {
            Movie1 movie = moviesList1.get(position);
            holder.title.setText(movie.getTitle());
            holder.genre.setText(movie.getGenre());
            holder.year.setText(movie.getYear());

        }*/

        switch (holder.getItemViewType()) {
            case Movie:
                MyViewHolder vh1 = (MyViewHolder) holder;
                Movie movie = (Movie) moviesList.get(position);
                vh1.title.setText(movie.getTitle());
                vh1.genre.setText(movie.getGenre());
                vh1.year.setText(movie.getYear());

                break;
            case Movie1:
                MyViewHolder vh2 = (MyViewHolder) holder;
                Movie1 movie1=(Movie1)moviesList1.get(position);
                vh2.title.setText(movie1.getTitle());
                vh2.year.setText(movie1.getYear());
                vh2.genre.setText(movie1.getGenre());

                break;
            default:
                break;
        }

    }

    @Override
    public int getItemCount() {
        return moviesList.size();
    }
public class ComplexRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    // The items to display in your RecyclerView
    private List<Object> items;

    private final int MOVIE= 0,THEATERS=1 , BLOCKBUSTER = 2;

    // Provide a suitable constructor (depends on the kind of dataset)
    public ComplexRecyclerViewAdapter(List<Object> items) {
        this.items = items;
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return this.items.size();
    }

    @Override
    public int getItemViewType(int position) {
           if (items.get(position) instanceof Movie) {
               return MOVIE;
         } else if (items.get(position) instanceof Theatrs ) {
               return THEATERS;
         }else if (items.get(position) instanceof Blockbuster ) {
               return BLOCKBUSTER ;
      }
         return -1;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup   viewGroup, int viewType) {
              RecyclerView.ViewHolder viewHolder;
  LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());

  switch (viewType) {
      case MOVIE:
          View v1 = inflater.inflate(R.layout.movie_viewholder, viewGroup, false);
          viewHolder = new ViewHolder1(v1);
          break;
      case THEATERS:
          View v2 = inflater.inflate(R.layout.theater_viewholder2, viewGroup, false);
          viewHolder = new ViewHolder2(v2);
          break;

      case BLOCKBUSTER :
          View v3 = inflater.inflate(R.layout.layout_blockbuster, viewGroup, false);
          viewHolder = new ViewHolder3(v3);
          break;
      default:
          View v = inflater.inflate(android.R.layout.simple_list_item_1, viewGroup, false);
          viewHolder = new RecyclerViewSimpleTextViewHolder(v);
          break;
  }
  return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
               switch (viewHolder.getItemViewType()) {
      case MOVIE:
          ViewHolder1 vh1 = (ViewHolder1) viewHolder;
          configureViewHolder1(vh1, position);
          break;
      case THEATERS:
          ViewHolder2 vh2 = (ViewHolder2) viewHolder;
          configureViewHolder2(vh2, position);
          break;

      case BLOCKBUSTER :
          ViewHolder3 vh3 = (ViewHolder3) viewHolder;
          configureViewHolder3(vh3, position);
          break;
      default:
          RecyclerViewSimpleTextViewHolder vh = (RecyclerViewSimpleTextViewHolder) viewHolder;
          configureDefaultViewHolder(vh, position);
          break;
  }
    }
}
运行程序之前的最后一个重要更改是将
RecycleServiceActivity
中的
bindDataToAdapter
方法更改为设置
ComplexRecycleServiceAdapter
而不是
SimpleItemRecycleServiceAdapter
,如下所示:

  private void bindDataToAdapter() {
      // Bind adapter to recycler view object
      recyclerView.setAdapter(new ComplexRecyclerViewAdapter(getSampleArrayList()));
  }

谢谢朋友,什么是CodeMate中的RecycleServiceImpleTextViewHolder?它用于捕获switch语句中的意外值。。你可以忽略它,或者改变它来处理你的默认操作。你可以改变代码以便