我正在为初创公司开发电子商务应用程序,以显示我使用过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)
答案 0 :(得分:0)
我认为您只需在试用版2中更改此功能,此后它就可以工作:
@Override
public int getItemViewType(int position) {
return position;
}
让我知道它是如何工作的。
顺便说一句,应该使用Glide而不是Picasso来加载图像。现在,它已经进行了优化。