Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.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 无法在recyclerview中添加第二个子项_Android_Android Recyclerview - Fatal编程技术网

Android 无法在recyclerview中添加第二个子项

Android 无法在recyclerview中添加第二个子项,android,android-recyclerview,Android,Android Recyclerview,无法在Recyclerview中添加第二个子布局。我正在将两个不同的数组传递到RecyclerAdapter以显示具有不同数据和视图的两个子布局。是否有任何解决方案可以使用相同的标题布局添加不同的子布局。我在垂直Recyclerview中添加了水平Recyclerview,并且想显示我附加的图像的详细信息吗 private void setupRecyclerView(RecyclerView recyclerView) { recyclerView.setLayoutManager(

无法在
Recyclerview
中添加第二个子布局。我正在将两个不同的数组传递到
RecyclerAdapter
以显示具有不同数据和视图的两个子布局。是否有任何解决方案可以使用相同的标题布局添加不同的子布局。我在垂直
Recyclerview
中添加了水平
Recyclerview
,并且想显示我附加的图像的详细信息吗

private void setupRecyclerView(RecyclerView recyclerView) {
     recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
     RecyclerAdapter recyclerAdapter = new RecyclerAdapter();

     int[] images = new int[]{
         R.drawable.finance,
         R.drawable.business,
         R.drawable.financejob,
         R.drawable.ecomchallenges
     };

     ArrayList<ChildView> childViews = new ArrayList<>();
     childViews.add(new ChildView(images[0], "The \"Best\" Startup Pitch Deck - How To Raise Venture Capital", "$100"));
     childViews.add(new ChildView(images[1], "An Entire MBA in 1 Course:Award Winning Business School Prof", "$100"));
     childViews.add(new ChildView(images[2], "What Finance Job is for You? Explanation of 14 Finance Roles", "$100"));
     childViews.add(new ChildView(images[3], "Learn To Build Beautiful HTML5 And CSS3 Websites In 1 Month", "$100"));

     int[] courseImage = new int[] {
         R.drawable.php,
         R.drawable.development,
         R.drawable.web,
         R.drawable.java
     };

     ArrayList<CourseByType> courseByTypes = new ArrayList<>();
     courseByTypes.add(new CourseByType("Technology", courseImage[0]));
     courseByTypes.add(new CourseByType("Business", courseImage[1]));
     courseByTypes.add(new CourseByType("Photography", courseImage[2]));
     courseByTypes.add(new CourseByType("Development", courseImage[3]));
     Log.d("","Above adapter");
     recyclerAdapter.addItem(new GroupView("Business", childViews));
     Log.d("","Below Child");
     recyclerAdapter.addCourseByType(new CourseByHeader("Technology", courseByTypes));
     Log.d("","Below Course");
     recyclerView.setAdapter(recyclerAdapter);

 }
RecyclerAdapter
包含一个
RecyclerView
,第一行有一个图像和3个
TextView
,第二行有1个
ImageView
和1个
TextView
。在第一个位置,会显示一个图像和三个文本视图,但不会在第二个视图上显示

这是我在emulator上运行后得到的视图

这是回收新闻的两个子项

ChildView.java

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

    ArrayList<PassValues> containerArrayList;

    ArrayList<GroupView> groupViews;
    ArrayList<CourseByHeader>courseByHeaders;
    private static final int TYPE_HEADER = 0;
    private static final int TYPE_ITEM = 1;


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        View view = LayoutInflater.from(context).inflate(R.layout.group_title, parent, false);
        return new ViewHolder(view);
    }

    public RecyclerAdapter(){
        containerArrayList = new ArrayList<>();
        groupViews = new ArrayList<>();
        courseByHeaders = new ArrayList<>();
    }

    public void addContainer(PassValues container){
        containerArrayList.add(container);


    }
    public void addItem(GroupView groupView){
        Log.d("","Inside Group method");
        groupViews.add(groupView);
    }
    public void addCourseByType(CourseByHeader courseByHeader){
        Log.d("","Inside Course method");
        courseByHeaders.add(courseByHeader);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Log.d("", "Pass Values out of IF" + position);
        ChildViewAdapter childViewAdapter = new ChildViewAdapter();
        if(position == 0){
            GroupView groupView = groupViews.get(position);
            holder.title.setText(groupView.getTitle());
            Log.d("", "Passing Values" + groupView.getTitle());
            holder.recyclerView.setLayoutManager(new LinearLayoutManager(holder.recyclerView.getContext(), LinearLayoutManager.HORIZONTAL, false));
            holder.recyclerView.setOnFlingListener(null);
            childViewAdapter.addChild(groupView.getChildViewList());
            holder.recyclerView.setAdapter(childViewAdapter);
        }
        if (position == 1) {
            CourseByHeader courseByHeader = courseByHeaders.get(position);
            holder.title.setText(courseByHeader.getTitle());
            Log.d("", "Passing Values" + courseByHeader.getTitle());
            holder.recyclerView.setLayoutManager(new LinearLayoutManager(holder.recyclerView.getContext(), LinearLayoutManager.HORIZONTAL, false));
            holder.recyclerView.setOnFlingListener(null);
            childViewAdapter.addCourse(courseByHeader.getCourseByTypes());
            holder.recyclerView.setAdapter(childViewAdapter);
        }

    }

    @Override
    public int getItemCount() {
        if(getItemViewType(0) == TYPE_HEADER)
        return groupViews.size() ;
        if (getItemViewType(1) == TYPE_ITEM)
            return courseByHeaders.size();
        else return -1;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView title;
        RecyclerView recyclerView;
        public ViewHolder(View itemView) {
            super(itemView);

            title = (TextView)itemView.findViewById(R.id.course_title);
            recyclerView = (RecyclerView)itemView.findViewById(R.id.group_recycler);

        }
    }
}
public class ChildView {

    int image;
    String course, price;

    public ChildView(int image, String course, String price) {
        this.image = image;
        this.course = course;
        this.price = price;
    }


    public int getImage() {
        return image;
    }

    public String getCourse() {
        return course;
    }

    public String getPrice() {
        return price;
    }

}
public class CourseByHeader {

    String title;
    ArrayList<CourseByType> courseByTypes;

    public CourseByHeader(String title, ArrayList<CourseByType> courseByTypes) {
        this.title = title;
        this.courseByTypes = courseByTypes;
    }

    public String getTitle() {
        return title;
    }

    public ArrayList<CourseByType> getCourseByTypes() {
        return courseByTypes;
    }
}
public class GroupView {
    String title;
    ArrayList<ChildView> childViewList;

    String courseBy;
    ArrayList<CourseByType> courseByTypes;

    public GroupView(String title, ArrayList<ChildView> childViewList) {
        this.title = title;
        this.childViewList = childViewList;
    }

    public String getTitle() {
        return title;
    }

    public ArrayList<ChildView> getChildViewList() {
        return childViewList;
    }
}
CourseByType.java

public class CourseByType {

    String courseName;
    int courseImage;

    public CourseByType(String courseName, int courseImage) {
        this.courseName = courseName;
        this.courseImage = courseImage;
    }

    public String getCourseName() {
        return courseName;
    }

    public int getCourseImage() {
        return courseImage;
    }
}
CourseByHeader.java

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

    ArrayList<PassValues> containerArrayList;

    ArrayList<GroupView> groupViews;
    ArrayList<CourseByHeader>courseByHeaders;
    private static final int TYPE_HEADER = 0;
    private static final int TYPE_ITEM = 1;


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        View view = LayoutInflater.from(context).inflate(R.layout.group_title, parent, false);
        return new ViewHolder(view);
    }

    public RecyclerAdapter(){
        containerArrayList = new ArrayList<>();
        groupViews = new ArrayList<>();
        courseByHeaders = new ArrayList<>();
    }

    public void addContainer(PassValues container){
        containerArrayList.add(container);


    }
    public void addItem(GroupView groupView){
        Log.d("","Inside Group method");
        groupViews.add(groupView);
    }
    public void addCourseByType(CourseByHeader courseByHeader){
        Log.d("","Inside Course method");
        courseByHeaders.add(courseByHeader);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Log.d("", "Pass Values out of IF" + position);
        ChildViewAdapter childViewAdapter = new ChildViewAdapter();
        if(position == 0){
            GroupView groupView = groupViews.get(position);
            holder.title.setText(groupView.getTitle());
            Log.d("", "Passing Values" + groupView.getTitle());
            holder.recyclerView.setLayoutManager(new LinearLayoutManager(holder.recyclerView.getContext(), LinearLayoutManager.HORIZONTAL, false));
            holder.recyclerView.setOnFlingListener(null);
            childViewAdapter.addChild(groupView.getChildViewList());
            holder.recyclerView.setAdapter(childViewAdapter);
        }
        if (position == 1) {
            CourseByHeader courseByHeader = courseByHeaders.get(position);
            holder.title.setText(courseByHeader.getTitle());
            Log.d("", "Passing Values" + courseByHeader.getTitle());
            holder.recyclerView.setLayoutManager(new LinearLayoutManager(holder.recyclerView.getContext(), LinearLayoutManager.HORIZONTAL, false));
            holder.recyclerView.setOnFlingListener(null);
            childViewAdapter.addCourse(courseByHeader.getCourseByTypes());
            holder.recyclerView.setAdapter(childViewAdapter);
        }

    }

    @Override
    public int getItemCount() {
        if(getItemViewType(0) == TYPE_HEADER)
        return groupViews.size() ;
        if (getItemViewType(1) == TYPE_ITEM)
            return courseByHeaders.size();
        else return -1;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView title;
        RecyclerView recyclerView;
        public ViewHolder(View itemView) {
            super(itemView);

            title = (TextView)itemView.findViewById(R.id.course_title);
            recyclerView = (RecyclerView)itemView.findViewById(R.id.group_recycler);

        }
    }
}
public class ChildView {

    int image;
    String course, price;

    public ChildView(int image, String course, String price) {
        this.image = image;
        this.course = course;
        this.price = price;
    }


    public int getImage() {
        return image;
    }

    public String getCourse() {
        return course;
    }

    public String getPrice() {
        return price;
    }

}
public class CourseByHeader {

    String title;
    ArrayList<CourseByType> courseByTypes;

    public CourseByHeader(String title, ArrayList<CourseByType> courseByTypes) {
        this.title = title;
        this.courseByTypes = courseByTypes;
    }

    public String getTitle() {
        return title;
    }

    public ArrayList<CourseByType> getCourseByTypes() {
        return courseByTypes;
    }
}
public class GroupView {
    String title;
    ArrayList<ChildView> childViewList;

    String courseBy;
    ArrayList<CourseByType> courseByTypes;

    public GroupView(String title, ArrayList<ChildView> childViewList) {
        this.title = title;
        this.childViewList = childViewList;
    }

    public String getTitle() {
        return title;
    }

    public ArrayList<ChildView> getChildViewList() {
        return childViewList;
    }
}
公共类课程主持人{
字符串标题;
arraylistcoursebytypes;
公共CourseByHeader(字符串标题,ArrayList courseByTypes){
this.title=标题;
this.courseByTypes=courseByTypes;
}
公共字符串getTitle(){
返回标题;
}
公共阵列列表getCourseByTypes(){
返回课程类型;
}
}
GroupView.java

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

    ArrayList<PassValues> containerArrayList;

    ArrayList<GroupView> groupViews;
    ArrayList<CourseByHeader>courseByHeaders;
    private static final int TYPE_HEADER = 0;
    private static final int TYPE_ITEM = 1;


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        View view = LayoutInflater.from(context).inflate(R.layout.group_title, parent, false);
        return new ViewHolder(view);
    }

    public RecyclerAdapter(){
        containerArrayList = new ArrayList<>();
        groupViews = new ArrayList<>();
        courseByHeaders = new ArrayList<>();
    }

    public void addContainer(PassValues container){
        containerArrayList.add(container);


    }
    public void addItem(GroupView groupView){
        Log.d("","Inside Group method");
        groupViews.add(groupView);
    }
    public void addCourseByType(CourseByHeader courseByHeader){
        Log.d("","Inside Course method");
        courseByHeaders.add(courseByHeader);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Log.d("", "Pass Values out of IF" + position);
        ChildViewAdapter childViewAdapter = new ChildViewAdapter();
        if(position == 0){
            GroupView groupView = groupViews.get(position);
            holder.title.setText(groupView.getTitle());
            Log.d("", "Passing Values" + groupView.getTitle());
            holder.recyclerView.setLayoutManager(new LinearLayoutManager(holder.recyclerView.getContext(), LinearLayoutManager.HORIZONTAL, false));
            holder.recyclerView.setOnFlingListener(null);
            childViewAdapter.addChild(groupView.getChildViewList());
            holder.recyclerView.setAdapter(childViewAdapter);
        }
        if (position == 1) {
            CourseByHeader courseByHeader = courseByHeaders.get(position);
            holder.title.setText(courseByHeader.getTitle());
            Log.d("", "Passing Values" + courseByHeader.getTitle());
            holder.recyclerView.setLayoutManager(new LinearLayoutManager(holder.recyclerView.getContext(), LinearLayoutManager.HORIZONTAL, false));
            holder.recyclerView.setOnFlingListener(null);
            childViewAdapter.addCourse(courseByHeader.getCourseByTypes());
            holder.recyclerView.setAdapter(childViewAdapter);
        }

    }

    @Override
    public int getItemCount() {
        if(getItemViewType(0) == TYPE_HEADER)
        return groupViews.size() ;
        if (getItemViewType(1) == TYPE_ITEM)
            return courseByHeaders.size();
        else return -1;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView title;
        RecyclerView recyclerView;
        public ViewHolder(View itemView) {
            super(itemView);

            title = (TextView)itemView.findViewById(R.id.course_title);
            recyclerView = (RecyclerView)itemView.findViewById(R.id.group_recycler);

        }
    }
}
public class ChildView {

    int image;
    String course, price;

    public ChildView(int image, String course, String price) {
        this.image = image;
        this.course = course;
        this.price = price;
    }


    public int getImage() {
        return image;
    }

    public String getCourse() {
        return course;
    }

    public String getPrice() {
        return price;
    }

}
public class CourseByHeader {

    String title;
    ArrayList<CourseByType> courseByTypes;

    public CourseByHeader(String title, ArrayList<CourseByType> courseByTypes) {
        this.title = title;
        this.courseByTypes = courseByTypes;
    }

    public String getTitle() {
        return title;
    }

    public ArrayList<CourseByType> getCourseByTypes() {
        return courseByTypes;
    }
}
public class GroupView {
    String title;
    ArrayList<ChildView> childViewList;

    String courseBy;
    ArrayList<CourseByType> courseByTypes;

    public GroupView(String title, ArrayList<ChildView> childViewList) {
        this.title = title;
        this.childViewList = childViewList;
    }

    public String getTitle() {
        return title;
    }

    public ArrayList<ChildView> getChildViewList() {
        return childViewList;
    }
}
公共类组视图{
字符串标题;
ArrayList儿童视图列表;
弦琴;
arraylistcoursebytypes;
公共组视图(字符串标题,ArrayList子视图列表){
this.title=标题;
this.childViewList=childViewList;
}
公共字符串getTitle(){
返回标题;
}
公共阵列列表getChildViewList(){
返回子视图列表;
}
}
Groupview和CouseByType类具有recycleradapter的标题和子列表

ChildViewAdapter.java

public class ChildViewAdapter extends RecyclerView.Adapter {

    ArrayList<ChildView> childViewList;
    ArrayList<CourseByType> courseByTypes;
    private static final int TYPE_HEADER = 0;
    private static final int TYPE_ITEM = 1;

    public class ViewHolder extends RecyclerView.ViewHolder{
        public ViewHolder(View itemView) {
            super(itemView);
        }
    }

    public class GroupHolder extends ViewHolder {
        public ImageView iamView;
        public TextView course, price;
        public GroupHolder(View itemView) {
            super(itemView);
            iamView = (ImageView) itemView.findViewById(R.id.course_image);
            course = (TextView) itemView.findViewById(R.id.course_by);
            price = (TextView) itemView.findViewById(R.id.price);
        }
    }

    public void addCourse(ArrayList<CourseByType> courseByType){
        courseByTypes = courseByType;
    }
    public void addChild(ArrayList<ChildView> childView){
        childViewList = childView;
    }

    public class Course extends ViewHolder {

        public ImageView courseTypeImage;
        public TextView courseType;

        public Course(View itemView) {
            super(itemView);
            courseTypeImage = (ImageView)itemView.findViewById(R.id.course_image);
            courseType = (TextView)itemView.findViewById(R.id.course_name_course);
        }
    }

    public ChildViewAdapter() {
        childViewList = new ArrayList<>();
        courseByTypes = new ArrayList<>();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        RecyclerView.ViewHolder vh = null;
        View v;
        if(viewType == TYPE_HEADER){
            v = LayoutInflater.from(context).inflate(R.layout.recycler_item, parent, false);
            return new GroupHolder(v);
        }if(viewType == TYPE_ITEM){
            v = LayoutInflater.from(context).inflate(R.layout.type_of_courses, parent, false);
            return new Course(v);
        }
        return vh;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if(holder instanceof GroupHolder){
            Log.d("","instance of Group Holder");
            ChildView childView = childViewList.get(position);
            ((GroupHolder)holder).iamView.setImageResource(childView.getImage());
            ((GroupHolder)holder).course.setText(childView.getCourse());
            ((GroupHolder)holder).price.setText(childView.getPrice());
            return;
        }
        if(holder instanceof Course){
            Log.d("","instance of Course ");
            CourseByType courseByType = courseByTypes.get(position);
            ((Course)holder).courseTypeImage.setImageResource(courseByType.getCourseImage());
            ((Course)holder).courseType.setText(courseByType.getCourseName());
            return;
        }

    }


    @Override
    public int getItemCount() {
        int size;
        if(childViewList.size()>0){
            return size = childViewList.size();
        }else return size = courseByTypes.size();
    }

    @Override
    public int getItemViewType(int position) {
        if(childViewList.size() != 0 && childViewList.size()>0){
            return TYPE_HEADER;
        }else return TYPE_ITEM;
    }


}
公共类ChildViewAdapter扩展了RecyclerView.Adapter{ ArrayList儿童视图列表; arraylistcoursebytypes; 私有静态最终int TYPE_头=0; 私有静态最终整数类型\ u项=1; 公共类ViewHolder扩展了RecyclerView.ViewHolder{ 公共视图持有者(视图项视图){ 超级(项目视图); } } 公共类GroupHolder扩展了ViewHolder{ 公众形象观; 公共文本查看课程、价格; 公共组持有人(查看项目视图){ 超级(项目视图); iamView=(ImageView)itemView.findViewById(R.id.course\u image); course=(TextView)itemView.findViewById(R.id.course\u by); price=(TextView)itemView.findViewById(R.id.price); } } public void addCourse(ArrayList courseByType){ courseByTypes=courseByType; } public void addChild(ArrayList childView){ childViewList=childView; } 公共课程扩展了ViewHolder{ 公众形象;公众形象; 公共文本视图课程类型; 公共课程(查看项目视图){ 超级(项目视图); courseTypeImage=(ImageView)itemView.findViewById(R.id.course\u image); courseType=(TextView)itemView.findViewById(R.id.course\u name\u course); } } 公共子视图适配器(){ childViewList=新建ArrayList(); courseByTypes=newarraylist(); } @凌驾 public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){ Context=parent.getContext(); RecyclerView.ViewHolder vh=null; 观点五; if(viewType==类型\标题){ v=布局展开器。从(上下文)。充气(R.layout.recycler\u项,父项,false); 返回新的集团持有人(v); }if(viewType==类型\项){ v=布局更平坦。从(上下文)。充气(R.layout.type\u of_courses,parent,false); 返回新课程(五); } 返回vh; } @凌驾 BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){ if(组持有人的持有人实例){ Log.d(“,”集团持有人实例”); ChildView ChildView=childViewList.get(位置); ((GroupHolder)holder.iamView.setImageResource(childView.getImage()); ((GroupHolder)holder.course.setText(childView.getCourse()); ((GroupHolder)holder.price.setText(childView.getPrice()); 返回; } if(课程持有人实例){ Log.d(“,”当然是“实例”); CourseByType CourseByType=courseByTypes.get(位置); ((课程)持有者).courseTypeImage.setImageResource(courseByType.getCourseImage()); ((课程)持有者).courseType.setText(courseByType.getCourseName()); 返回; } } @凌驾 public int getItemCount(){ 整数大小; 如果(childViewList.size()>0){ 返回大小=childViewList.size(); }else返回大小=courseByTypes.size(); } @凌驾 public int getItemViewType(int位置){ 如果(childViewList.size()!=0&&childViewList.size()>0){ 返回类型_头; }else返回类型_项; } }
此childview适配器有两种视图类型:第一种是一个图像和3个文本,第二种视图类型包含一个图像和一个文本。当我从片段传递值时,只显示第一种视图类型,而第二种视图类型不从片段获取值。

要在recyclerview中显示多个不同的视图,必须重写
getItemViewType()
在recyclerview适配器中

 //getItemViewType enables dynamic viewholder creation
@Override
public int getItemViewType(int position) {
    //you will need to add a integer with variable name viewTypeCode
    //for view1 set viewTypeCode = 100 and for view2 set viewTypeCode = 200
    viewTypeCode = itemList.get(position).getViewTypeCode();
    return viewTypeCode;
}
这就是为什么对于多个视图类型,
onCreateViewHolder
会有所不同。你必须像这样修改你的

@Override
public FeedViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    switch (viewType) {
        case 100: return new FeedViewHolder(layoutInflater.inflate(R.layout.v1, parent, false),100);
        case 200: return new FeedViewHolder(layoutInflater.inflate(R.layout.v2, parent, false),200);
    }
    return null;
}
OnBindViewHolder
也将进行类似修改

 @Override
public void onBindViewHolder(final FeedViewHolder holder, int position) {
     viewTypeCode = itemList.get(position).getViewTypeCode();
    switch ( viewTypeCode) {
        case 100:
           //your code for v1

        case 200:
            //your code for v2
    }
}
类似地,修改了ViewHolder类

class FeedViewHolder extends RecyclerView.ViewHolder{
   //declare variables here
  public FeedViewHolder(View v, int viewType) {
        super(v);
        switch (viewType) {
        //instead of itemView.findViewById you will have to use v.findViewById
        case 100:
           //your code for v1

        case 200:
            //your code for v2
    }
}
有关更多参考,请参阅SO答案

不要通过两个单独的列表。Mak