Java RecycleServiceAdapter中的空指针异常

Java RecycleServiceAdapter中的空指针异常,java,android,nullpointerexception,android-adapter,Java,Android,Nullpointerexception,Android Adapter,适配器工作正常,直到我决定添加本机广告,为此我在适配器中做了6次更改 添加了新的视图类型(AD_视图_类型) 添加了新的ViewHolder(NativeExpressAdViewHolder) 更改了getItemViewType(使其每8个位置返回AD_视图_类型) 在onCreateViewHolder中添加了一个新案例 switch (viewType){ case AD_VIEW_TYPE: View nativeExpressLayoutV

适配器工作正常,直到我决定添加本机广告,为此我在适配器中做了6次更改

  • 添加了新的视图类型(AD_视图_类型)
  • 添加了新的ViewHolder(NativeExpressAdViewHolder)
  • 更改了getItemViewType(使其每8个位置返回AD_视图_类型)
  • 在onCreateViewHolder中添加了一个新案例

         switch (viewType){
    
            case AD_VIEW_TYPE:
            View nativeExpressLayoutView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.native_express_ad_container, parent, false);
            return new NativeExpressAdViewHolder(nativeExpressLayoutView);
    
              switch (viewType){
    
              case AD_VIEW_TYPE:
              NativeExpressAdViewHolder nativeExpressHolder = (NativeExpressAdViewHolder)holder;
              NativeExpressAdView adView = (NativeExpressAdView)arrayList.get(position);
    
            ViewGroup adCardView = (ViewGroup)nativeExpressHolder.itemView;
            adCardView.removeAllViews();
    
            if(adView.getParent() != null){
                ((ViewGroup)adView.getParent()).removeView(adView);
            }
    
            adCardView.addView(adView);
            break;
    
  • 向onBindViewHolder添加了一个新案例

         switch (viewType){
    
            case AD_VIEW_TYPE:
            View nativeExpressLayoutView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.native_express_ad_container, parent, false);
            return new NativeExpressAdViewHolder(nativeExpressLayoutView);
    
              switch (viewType){
    
              case AD_VIEW_TYPE:
              NativeExpressAdViewHolder nativeExpressHolder = (NativeExpressAdViewHolder)holder;
              NativeExpressAdView adView = (NativeExpressAdView)arrayList.get(position);
    
            ViewGroup adCardView = (ViewGroup)nativeExpressHolder.itemView;
            adCardView.removeAllViews();
    
            if(adView.getParent() != null){
                ((ViewGroup)adView.getParent()).removeView(adView);
            }
    
            adCardView.addView(adView);
            break;
    
  • 除了上述更改之外,我还在Activity and Adapter中将我的
    ArrayList
    更改为
    ArrayList

  • 现在的问题是,当我运行应用程序时,它会抛出
    NullPointerException

    logcat说

     java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
                                                                          at com.company.appname.adapters.RecyclerViewAdapter$RecyclerViewHolder.<init>(RecyclerViewAdapter.java:186)
                                                                          at com.company.appname.adapters.RecyclerViewAdapter$RecyclerViewHolder.<init>(RecyclerViewAdapter.java:165)
                                                                          at com.company.appname.adapters.RecyclerViewAdapter$NativeExpressAdViewHolder.<init>(RecyclerViewAdapter.java:150)
                                                                          at com.company.appname.adapters.RecyclerViewAdapter.onCreateViewHolder(RecyclerViewAdapter.java:84)
                                                                          at com.company.appname.adapters.RecyclerViewAdapter.onCreateViewHolder(RecyclerViewAdapter.java:48)
    
    java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“void android.view.view.setOnClickListener(android.view.view$OnClickListener)”
    位于com.company.appname.adapters.RecycleServiceAdapter$RecycleServiceWholder。(RecycleServiceAdapter.java:186)
    位于com.company.appname.adapters.RecycleServiceAdapter$RecycleServiceWholder。(RecycleServiceAdapter.java:165)
    位于com.company.appname.adapters.RecycleServiceAdapter$NativeExpressAdViewHolder。(RecycleServiceAdapter.java:150)
    位于com.company.appname.adapters.RecycleServiceAdapter.onCreateViewHolder(RecycleServiceAdapter.java:84)
    位于com.company.appname.adapters.RecycleServiceAdapter.onCreateViewHolder(RecycleServiceAdapter.java:48)
    
    这些是我的代码中logcat指向的部分

    /*Line 48*/public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolder> {
     public RecyclerViewAdapter(Context context, ArrayList<Object> arrayList, ArrayList<String> favouriteItemList, int totalCount {...}
    
     @Override
     public long getItemId(int position){...}
    
         @Override
         public RecyclerViewAdapter.RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    
             switch (viewType){
    
             case AD_VIEW_TYPE:
                View nativeExpressLayoutView = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.native_express_ad_container, parent, false);
     /*Line 84*/               return new NativeExpressAdViewHolder(nativeExpressLayoutView); 
    
             case MENU_ITEM_VIEW_TYPE:
    
             default:
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cards, parent, false);
                return new RecyclerViewHolder(view);
            }
        }
    
         @Override
         public void onBindViewHolder(final RecyclerViewHolder holder, final int position){...}
    
             public class NativeExpressAdViewHolder extends RecyclerViewHolder{
                    NativeExpressAdViewHolder(View view){
    /*Line 150*/                    super(view);
                    }
            }
    
         @Override
         public int getItemViewType(int position){...}
    
         @Override
         public int getItemCount(){...}
    
    
    /*Line 165*/        public class RecyclerViewHolder extends RecyclerView.ViewHolder {
    
        TextView title;
        RelativeLayout relativeLayout;
        RelativeLayout cardDescription;
        SimpleDraweeView image;
        ImageView favourite_button;
        CardSetterGetter cardSetterGetter;
        ImageView share;
    
    
        private RecyclerViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.image_title);
            relativeLayout = (RelativeLayout) itemView.findViewById(R.id.activity_dash_board);
            cardDescription = (RelativeLayout) itemView.findViewById(R.id.card_details);
            image = (SimpleDraweeView) itemView.findViewById(R.id.image);
            favourite_button = (ImageView) itemView.findViewById(R.id.favourite_button);
            share = (ImageView) itemView.findViewById(R.id.share);
    
     /*Line 186*/           image.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    Activity activity = (Activity) context;
                    saveInfo(constants.SERVERIP.concat(cardSetterGetter.getImageurl()), cardSetterGetter.getImageId(), cardSetterGetter.getDescription(), cardSetterGetter.getImagetitle(), cardSetterGetter.getFavourite());
                    Intent i = new Intent().setClass(context, DetailsImageviewActivity.class);
                    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
                    context.startActivity(i);
                    activity.overridePendingTransition(R.anim.pull_from_right, R.anim.pull_out_to_right);
                }
            });
    
        }
    }
    }
    
    /*第48行*/公共类RecycleServiceAdapter扩展了RecycleView.Adapter{
    公共RecycleServiceAdapter(上下文上下文、ArrayList ArrayList、ArrayList FavoriteItemList、int totalCount{…}
    @凌驾
    公共长getItemId(int位置){…}
    @凌驾
    public RecycleServiceAdapter.RecycleServiceWholder onCreateViewHolder(视图组父级,int-viewType){
    开关(视图类型){
    案例广告视图类型:
    View nativeExpressLayoutView=LayoutFlater.from(parent.getContext())
    .充气(R.layout.native\u express\u ad\u container,父级,false);
    /*第84行*/返回新的NativeExpressAdViewHolder(nativeExpressLayoutView);
    案例菜单\项目\视图\类型:
    违约:
    View=LayoutInflater.from(parent.getContext()).flate(R.layout.cards,parent,false);
    返回新的RecycleServiceWholder(视图);
    }
    }
    @凌驾
    public void onBindViewHolder(最终RecyclerViewHolder持有者,最终int位置){…}
    公共类NativeExpressAdViewHolder扩展了RecycleServiceWholder{
    NativeExpressAdViewHolder(视图){
    /*第150行*/super(视图);
    }
    }
    @凌驾
    公共int getItemViewType(int位置){…}
    @凌驾
    public int getItemCount(){…}
    /*第165行*/公共类RecyclerViewHolder扩展了RecyclerView.ViewHolder{
    文本视图标题;
    相对的相对的;
    相对性描述;
    简单回顾图像;
    ImageView收藏夹按钮;
    cardsettergeter cardsettergeter;
    图像视图共享;
    private RecycleServiceWholder(查看项目视图){
    超级(项目视图);
    title=(TextView)itemView.findViewById(R.id.image\u title);
    relativeLayout=(relativeLayout)itemView.findViewById(R.id.activity\u dash\u board);
    cardDescription=(RelativeLayout)itemView.findViewById(R.id.card\U详细信息);
    image=(simpledraweview)itemView.findviewbyd(R.id.image);
    Favorite_按钮=(ImageView)itemView.findViewById(R.id.Favorite_按钮);
    share=(ImageView)itemviewbyd(R.id.share);
    /*第186行*/image.setOnClickListener(新视图.OnClickListener(){
    @凌驾
    公共void onClick(视图){
    活动=(活动)上下文;
    saveInfo(constants.SERVERIP.concat(cardsetterget.getImageurl()),cardsetterget.getImageId(),cardsetterget.getDescription(),cardsetterget.getImagetitle(),cardsetterget.getFavorite());
    Intent i=new Intent().setClass(context,DetailsImageviewActivity.class);
    i、 setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
    背景。起始触觉(i);
    activity.overridePendingTransition(R.anim.pull_from_right,R.anim.pull_out_right);
    }
    });
    }
    }
    }
    

    我知道什么是Null PoExtExchange,我知道解决这些问题的方法,但是在这种情况下,我很难找到问题的根源和解决办法。所以如果解决方案很简单,请不要把问题标记为复制品,请考虑帮助我解决这个问题。

    < P>当2个不同视图类型膨胀时在recyclerView中,我们需要创建两个独立的
    ViewHolder
    类来包含每个布局中的不同元素

    请尝试以下操作:

    //make this a separate class,but not inside the onBindViewHolder
    private class NativeExpressAdViewHolder extends RecyclerView.ViewHolder{
        NativeExpressAdViewHolder(View view){                            
        super(view);
        //find the view here
        adView = (NativeExpressAdView)view.findViewById(R.id.native_ad);
    }
    
    private class RecyclerViewHolder extends RecyclerView.ViewHolder{
       //this one as usual..
    }
    
    
    
    //change your onCreateViewHolder for this as well,
    // cause now you have 2 view type,so you just override from universal 
    //RecyclerView.ViewHolder,not need RecyclerViewAdapter.RecyclerViewHolder
       @Override
         public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { }
    
    
    
    
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        int viewType = getItemViewType(position);
        switch (viewType){
          case AD_VIEW_TYPE:
          final NativeExpressAdViewHolder adHolder (NativeExpressAdViewHolder)holder
           //here find your view and load the ad
    
    
         break;
         case MENU_ITEM_VIEW_TYPE:
         final  RecyclerViewHolder viewHolder = (RecyclerViewHolder)holder
         //do your thing here,find view,assign value to the layout
    
        }
    
    还有一件事,请检查您的XML,您的XML应该如下所示

    <com.google.android.gms.ads.NativeExpressAdView
            xmlns:ads="http://schemas.android.com/apk/res-auto"
            android:id="@+id/native_ad"
            android:layout_gravity="center_horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            ads:adSize="360x132"
            ads:adUnitId="@string/your_ads">
    
     </com.google.android.gms.ads.NativeExpressAdView>
    
    
    
    我知道什么是NullPointerException以及如何修复它。只是我在这里找不到问题。这就是为什么我需要问题特定的解决方案,而不是一般的解决方案。为什么您的
    公共类NativeExpressAdViewHolder扩展了RecycleServiceWholder{
    在你的
    onBindViewHolder中
    ?@ken因为演员阵容问题,我在这里问了一个关于StackOverflow的问题,有人建议我这样做,它解决了这个问题。谢谢你的回答,ken,但是NativeExpressAdViewHolder的onBindViewHolder已经用完了,你想让我在另一个java文件中使用它吗?如果它已经读过了