如何使用单个适配器在recylerview中实现多个模型类的Multiple View Type?

时间:2019-06-13 17:07:03

标签: android android-recyclerview recycler-adapter

我正在为初创公司开发电子商务应用程序,以显示我使用过Recycler视图的各个类别中列出的产品。对于单个变体产品,我自定义的模板可以完美地工作,它包含一个imageview,几个文本框和一个微调框。当我尝试为具有单独模型类的多个变体产品创建一个Viewholder并使用多视图类型猜想将其集成到回收站时,出现了问题,我已经清除了初始错误“索引超出范围大小1索引1”,但是资源Oxo(空指针异常)错误仍然不清楚,在这种情况下我还是空白,我们将不胜感激。

已经浏览了吨,stackoverflow和其他存储库以供参考,例如多视图类型,实现多视图等。

Trial Code 1

public class BreadAdapter extendsRecyclerView.Adapter<BreadAdapter.Viewholder> {


private ImageView imageView1;

private TextView title1;

private TextView price1;

private TextView subtitle1;

private Spinner qty_spinner1;

private List<BreadModelClass> breadModelClassList;

private List<BreadModelClass2> breadModelClass2List;

private Context context;

public BreadAdapter(List<BreadModelClass> breadModelClassList,List<BreadModelClass2> breadModelClass2List) {

    this.breadModelClassList = breadModelClassList;

    this.breadModelClass2List = breadModelClass2List;


}

@NonNull
@Override
public Viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {


    LayoutInflater inflater = LayoutInflater.from(parent.getContext());

    context = parent.getContext();

    View view = inflater.inflate(viewType,parent,false);

    Viewholder viewholder = null;


    switch (viewType){

        case R.layout.bread_item_layout:

            viewholder = new Viewholder(view);

            break;

        case R.layout.bread_multipleview:

            viewholder = new Viewholder1(view);

            break;

    }

    return viewholder;

}





@Override
public void onBindViewHolder(@NonNull final Viewholder viewholder, final int position) {


    switch (viewholder.getItemViewType()){

        case 0:

            String resource = breadModelClassList.get(position).getImage_resource();

            String title = breadModelClassList.get(position).getTitle();

            int price = breadModelClassList.get(position).getPrice();

            String desc = breadModelClassList.get(position).getDesc();

            String subtitle = breadModelClassList.get(position).getSubtitle();

            viewholder.setData(resource,title,price,desc,subtitle);

            break;

        case 1:

            String resource1 = breadModelClass2List.get(position).getImage_resource1();

            String title1 = breadModelClass2List.get(position).getTitle1();

            int price1 = breadModelClass2List.get(position).getPrice1();

            String desc1 = breadModelClass2List.get(position).getDesc1();

            String desc2 = breadModelClass2List.get(position).getDesc2();

            String subtitle1 = breadModelClass2List.get(position).getSubtitle1();

            viewholder.setData1(resource1,title1,price1,desc1,desc2,subtitle1);

            break;

    }

    viewholder.getAdapterPosition();

}

@Override
public int getItemCount() {


    return breadModelClassList.size()+breadModelClass2List.size();
}


public class Viewholder extends RecyclerView.ViewHolder{

    private ImageView imageView;

    private TextView title;

    private TextView price;

    private TextView subtitle;

    private Spinner qty_spinner;

    public Viewholder(@NonNull View itemView) {

        super(itemView);

        imageView = itemView.findViewById(R.id.product_imageview);

        title = itemView.findViewById(R.id.product_title);

        price = itemView.findViewById(R.id.product_price);

        subtitle = itemView.findViewById(R.id.product_subtitle);

        qty_spinner = itemView.findViewById(R.id.bread_spinner);

    }

    private void setData(final String resource, String titleText, int priceText, String descText, String subText){

        Picasso.get().load(resource).networkPolicy(NetworkPolicy.OFFLINE).into(imageView, new Callback() {
            @Override
            public void onSuccess() {




            }

            @Override
            public void onError(Exception e) {

                Picasso.get().load(resource).into(imageView);
            }
        });

        title.setText(titleText);

        price.setText(String.valueOf(priceText));

        subtitle.setText(subText);

        final List<String> qty = new ArrayList<>();

        qty.add(descText);

        ArrayAdapter<String> qtyAdapter = new ArrayAdapter<>(context,R.layout.spinner_layout,qty);

        qtyAdapter.setDropDownViewResource(R.layout.spinner_layout);

        qty_spinner.setAdapter(qtyAdapter);



    }

    private void setData1(final String resource1, String titleText1, int priceText1, String descText1, String descText2, String subText1){

        Picasso.get().load(resource1).networkPolicy(NetworkPolicy.OFFLINE).into(imageView1, new Callback() {
            @Override
            public void onSuccess() {




            }

            @Override
            public void onError(Exception e) {

                Picasso.get().load(resource1).into(imageView1);
            }
        });

        title1.setText(titleText1);

        price1.setText(String.valueOf(priceText1));

        subtitle1.setText(subText1);

        final List<String> qty = new ArrayList<>();

        qty.add(descText1);

        qty.add(descText2);

        ArrayAdapter<String> qtyAdapter = new ArrayAdapter<>(context,R.layout.spinner_layout,qty);

        qtyAdapter.setDropDownViewResource(R.layout.spinner_layout);

        qty_spinner1.setAdapter(qtyAdapter);



    }


}

public class Viewholder1 extends Viewholder{

    public Viewholder1(@NonNull View itemView) {

        super(itemView);

        imageView1 = itemView.findViewById(R.id.product_imageview1);

        title1 = itemView.findViewById(R.id.product_title1);

        price1 = itemView.findViewById(R.id.product_price1);

        subtitle1 = itemView.findViewById(R.id.product_subtitle1);

        qty_spinner1 = itemView.findViewById(R.id.bread_spinner1);


    }



}

@Override
public int getItemViewType(int position) {

    switch(position){

        case 0:

            return R.layout.bread_item_layout;

        case 1:

            return R.layout.bread_multipleview;


    }

    return 0;

}

Trial Code 2

public class BreadAdapter extends RecyclerView.Adapter<BreadAdapter.Viewholder> {


private ImageView imageView1;

private TextView title1;

private TextView price1;

private TextView subtitle1;

private Spinner qty_spinner1;

private final static int SINGLE_VIEW = 0 , DOUBLE_VIEW = 1;

private List<BreadModelClass> breadModelClassList;

private List<BreadModelClass2> breadModelClass2List;

private Context context;

public BreadAdapter(List<BreadModelClass> breadModelClassList,List<BreadModelClass2> breadModelClass2List) {

    this.breadModelClassList = breadModelClassList;

    this.breadModelClass2List = breadModelClass2List;


}

@NonNull
@Override
public Viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {


    int layout;

    context = parent.getContext();

    Viewholder viewholder;

    switch (viewType){

        case SINGLE_VIEW:

            layout = R.layout.bread_item_layout;

            View singleView = LayoutInflater.from(parent.getContext()).inflate(layout,parent,false);

            viewholder = new Viewholder(singleView);

            break;

        case DOUBLE_VIEW:

            layout = R.layout.bread_multipleview;

            View doubleView = LayoutInflater.from(parent.getContext()).inflate(layout,parent,false);

            viewholder = new Viewholder1(doubleView);

            break;

            default:

                viewholder = null;

                break;

    }

    return viewholder;


}

@Override
public void onBindViewHolder(@NonNull final Viewholder viewholder, final int position) {


    switch (viewholder.getItemViewType()){

        case SINGLEVIEW:

            String resource = breadModelClassList.get(position).getImage_resource();

            String title = breadModelClassList.get(position).getTitle();

            int price = breadModelClassList.get(position).getPrice();

            String desc = breadModelClassList.get(position).getDesc();

            String subtitle = breadModelClassList.get(position).getSubtitle();

            viewholder.setData(resource,title,price,desc,subtitle);

            break;

        case DOUBLEVIEW:

            String resource1 = breadModelClass2List.get(position).getImage_resource1();

            String title1 = breadModelClass2List.get(position).getTitle1();

            int price1 = breadModelClass2List.get(position).getPrice1();

            String desc1 = breadModelClass2List.get(position).getDesc1();

            String desc2 = breadModelClass2List.get(position).getDesc2();

            String subtitle1 = breadModelClass2List.get(position).getSubtitle1();

            viewholder.setData1(resource1,title1,price1,desc1,desc2,subtitle1);

            break;

    }

    viewholder.getAdapterPosition();

}

@Override
public int getItemCount() {


    return breadModelClassList.size()+breadModelClass2List.size();
}


public class Viewholder extends RecyclerView.ViewHolder{

    private ImageView imageView;

    private TextView title;

    private TextView price;

    private TextView subtitle;

    private Spinner qty_spinner;

    public Viewholder(@NonNull View itemView) {

        super(itemView);

        imageView = itemView.findViewById(R.id.product_imageview);

        title = itemView.findViewById(R.id.product_title);

        price = itemView.findViewById(R.id.product_price);

        subtitle = itemView.findViewById(R.id.product_subtitle);

        qty_spinner = itemView.findViewById(R.id.bread_spinner);

    }

    private void setData(final String resource, String titleText, int priceText, String descText, String subText){

        Picasso.get().load(resource).networkPolicy(NetworkPolicy.OFFLINE).into(imageView, new Callback() {
            @Override
            public void onSuccess() {




            }

            @Override
            public void onError(Exception e) {

                Picasso.get().load(resource).into(imageView);
            }
        });

        title.setText(titleText);

        price.setText(String.valueOf(priceText));

        subtitle.setText(subText);

        final List<String> qty = new ArrayList<>();

        qty.add(descText);

        ArrayAdapter<String> qtyAdapter = new ArrayAdapter<>(context,R.layout.spinner_layout,qty);

        qtyAdapter.setDropDownViewResource(R.layout.spinner_layout);

        qty_spinner.setAdapter(qtyAdapter);



    }

    private void setData1(final String resource1, String titleText1, int priceText1, String descText1, String descText2, String subText1){

        Picasso.get().load(resource1).networkPolicy(NetworkPolicy.OFFLINE).into(imageView1, new Callback() {
            @Override
            public void onSuccess() {




            }

            @Override
            public void onError(Exception e) {

                Picasso.get().load(resource1).into(imageView1);
            }
        });

        title1.setText(titleText1);

        price1.setText(String.valueOf(priceText1));

        subtitle1.setText(subText1);

        final List<String> qty = new ArrayList<>();

        qty.add(descText1);

        qty.add(descText2);

        ArrayAdapter<String> qtyAdapter = new ArrayAdapter<>(context,R.layout.spinner_layout,qty);

        qtyAdapter.setDropDownViewResource(R.layout.spinner_layout);

        qty_spinner1.setAdapter(qtyAdapter);



    }


}

public class Viewholder1 extends Viewholder{

    public Viewholder1(@NonNull View itemView) {

        super(itemView);

        imageView1 = itemView.findViewById(R.id.product_imageview1);

        title1 = itemView.findViewById(R.id.product_title1);

        price1 = itemView.findViewById(R.id.product_price1);

        subtitle1 = itemView.findViewById(R.id.product_subtitle1);

        qty_spinner1 = itemView.findViewById(R.id.bread_spinner1);


    }



}

@Override
public int getItemViewType(int position) {

    switch(position){

        case SINGLEVIEW:

            return R.layout.bread_item_layout;

        case DOUBLEVIEW:

            return R.layout.bread_multipleview;


    }

    return 0;

}

Trail Error 1

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.stuffsmart, PID: 4217
android.content.res.Resources$NotFoundException: Resource ID #0x0
    at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:216)
    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2155)
    at android.content.res.Resources.getLayout(Resources.java:1155)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:421)
    at com.example.stuffsmart.BreadAdapter.onCreateViewHolder(BreadAdapter.java:67)
    at com.example.stuffsmart.BreadAdapter.onCreateViewHolder(BreadAdapter.java:28)
    at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6794)
    at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5975)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641)
    at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4194)
    at android.view.View.layout(View.java:20672)
    at android.view.ViewGroup.layout(ViewGroup.java:6194)
    at android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
    at android.view.View.layout(View.java:20672)
    at android.view.ViewGroup.layout(ViewGroup.java:6194)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:20672)
    at android.view.ViewGroup.layout(ViewGroup.java:6194)
    at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:444)
    at android.view.View.layout(View.java:20672)
    at android.view.ViewGroup.layout(ViewGroup.java:6194)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:20672)
    at android.view.ViewGroup.layout(ViewGroup.java:6194)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
    at android.view.View.layout(View.java:20672)
    at android.view.ViewGroup.layout(ViewGroup.java:6194)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at com.android.internal.policy.DecorView.onLayout(DecorView.java:753)
    at android.view.View.layout(View.java:20672)
    at android.view.ViewGroup.layout(ViewGroup.java:6194)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2792)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2319)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
    at android.view.Choreographer.doCallbacks(Choreographer.java:761)
    at android.view.Choreographer.doFrame(Choreographer.java:696)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Trail Error 2

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.stuffsmart, PID: 4459
java.lang.NullPointerException: Attempt to read from field 'android.view.View android.support.v7.widget.RecyclerView$ViewHolder.itemView' on a null object reference
    at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6795)
    at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5975)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641)
    at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4194)
    at android.view.View.layout(View.java:20672)
    at android.view.ViewGroup.layout(ViewGroup.java:6194)
    at android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
    at android.view.View.layout(View.java:20672)
    at android.view.ViewGroup.layout(ViewGroup.java:6194)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:20672)
    at android.view.ViewGroup.layout(ViewGroup.java:6194)
    at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:444)
    at android.view.View.layout(View.java:20672)
    at android.view.ViewGroup.layout(ViewGroup.java:6194)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:20672)
    at android.view.ViewGroup.layout(ViewGroup.java:6194)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
    at android.view.View.layout(View.java:20672)
    at android.view.ViewGroup.layout(ViewGroup.java:6194)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at com.android.internal.policy.DecorView.onLayout(DecorView.java:753)
    at android.view.View.layout(View.java:20672)
    at android.view.ViewGroup.layout(ViewGroup.java:6194)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2792)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2319)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
    at android.view.Choreographer.doCallbacks(Choreographer.java:761)
    at android.view.Choreographer.doFrame(Choreographer.java:696)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

1 个答案:

答案 0 :(得分:0)

我认为您只需在试用版2中更改此功能,此后它就可以工作:

    @Override
    public int getItemViewType(int position) {
        return position;
    }

让我知道它是如何工作的。

顺便说一句,应该使用Glide而不是Picasso来加载图像。现在,它已经进行了优化。