无法在recyclerview

时间:2016-10-08 04:40:30

标签: android android-recyclerview recycler-adapter

无法在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);

 }

这是我将值设置为两个不同

的主要片段
arraylist ArrayList<ChildView> childViews = new ArrayList<>() 

ArrayList<CourseByType> courseByTypes = new ArrayList<>() 

子视图的值正确传递但CourseByType值未传递。这是此片段类的适配器类。

RecyclerAdapter.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);

        }
    }
}

RecyclerAdapter包含一个RecyclerView,其中第一行包含一个图像,另外一个textviews,第二行包含1 ImageView和1 TextView。在第一个位置,会显示一个图像和三个文本视图,但它不会出现在第二个视图

这是我在模拟器上运行后获得的视图。

enter image description here

这是RecyclerViews

的两个孩子

ChildView.java

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;
    }

}

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 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;
    }
}

GroupView.java

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;
    }
}

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;
    }


}

这个子视图适配器有两种视图类型,第一种是一种图像,三种文本,第二种视图类型包含一个图像和一种文本。当我从片段传递值时,只显示第一种视图类型,第二种视图类型不从片段获取值。

1 个答案:

答案 0 :(得分:0)

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

 //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
    }
}

有关进一步参考,请参阅this SO回答

不要传递两个单独的列表。使用像这样的自定义类 -

class MyClass {
   int viewTypeCode;
   CustomClass1 c1;
   CustomClass2 c2;

//add the setter getter
}

准备数据时的活动。

List<MyClass> itemList = new ArrayList<>();
//put whatever logic you need to make the order of the list
//if CustomClass1 object is put then setViewTypeCode(100), setCustomClass2 = null
//if CustomClass2 object is put then setViewTypeCode(200), setCustomClass1 = null

构建数据后,将其发送到适配器。