0

我在我的RecyclerView類中創建了兩個viewHolders,一個用於內容,另一個用於Facebook原生廣告,運行後我的應用程序立即發生衝突。我如何克服這一點?java.lang.ClassCastException在RecycleView中,ViewHolder

@Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     switch (viewType) { 
      case 0: 
       return new ViewHolderBoxOffice(layoutInflater.from(parent.getContext()).inflate(R.layout.custom_movie_box_office, parent, false)); 
      case 2: 

       return new NativeAdViewHolder(layoutInflater.from(parent.getContext()).inflate(R.layout.custom_ads_facebook, parent, false)); 

     } 

     return null; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     switch (holder.getItemViewType()) { 
      case 0: 
       ViewHolderBoxOffice v_holder = (ViewHolderBoxOffice) holder; 
       Movie currentMovie = mlistMovies.get(position); 
       v_holder.movieTitle.setText(currentMovie.getTitle()); 
       Date movieReleaseDate = currentMovie.getReleaseDateTheater(); 
       if (movieReleaseDate != null) { 
        String formmattedDate = dateFormat.format(movieReleaseDate); 
        v_holder.movieReleaseDate.setText(formmattedDate); 
       } else { 
        v_holder.movieReleaseDate.setText(Constants.NA); 

       } 
       int audienceScore = currentMovie.getAudienceScore(); 
       if (audienceScore == -1) { 
        v_holder.movieAudienceScore.setRating(0.0F); 
        v_holder.movieAudienceScore.setAlpha(0.5F); 
       } else { 
        v_holder.movieAudienceScore.setRating(currentMovie.getAudienceScore()/20.0F); 
        v_holder.movieAudienceScore.setAlpha(1.0F); 
       } 
       String urlThumbnail = currentMovie.getUrlThumbnail(); 
       loadImages(urlThumbnail, v_holder); 
      case 2: 
       NativeAdViewHolder mHolder=(NativeAdViewHolder)holder; 
       // Setting the Text. 

       nativeAd.unregisterView(); 
       mHolder.nativeAdCallToAction.setText(nativeAd.getAdCallToAction()); 
       mHolder.nativeAdSocialContext.setText(nativeAd.getAdSocialContext()); 
       mHolder.nativeAdTitle.setText(nativeAd.getAdTitle()); 
       mHolder.nativeAdBody.setText(nativeAd.getAdBody()); 

       // Downloading and setting the ad icon. 
       NativeAd.Image adIcon = nativeAd.getAdIcon(); 
       NativeAd.downloadAndDisplayImage(adIcon, mHolder.nativeAdIcon); 

       // Download and setting the cover image. 
       NativeAd.Image adCoverImage = nativeAd.getAdCoverImage(); 
       mHolder.nativeAdMedia.setNativeAd(nativeAd); 


       // Add adChoices icon 

       // if (adChoicesView == null) 

       if(! (mHolder.adview.getChildAt(0) instanceof AdChoicesView)){ 
        AdChoicesView adChoicesView = new AdChoicesView(layoutInflater.getContext(), nativeAd, true); 

        mHolder.adview.addView(adChoicesView, 0); 
       } 

       nativeAd.registerViewForInteraction(mHolder.adview); 

       default: 
        break; 
     } 
     if (position > previousPosition) { 
      comeagain.materialdesign.anim.AnimationUtils.animate(holder, true); 

     } else { 
      comeagain.materialdesign.anim.AnimationUtils.animate(holder, false); 

     } 
     previousPosition = position; 

    } 



    private void loadImages(String urlThumbnail, final ViewHolderBoxOffice holder) { 
     if (urlThumbnail != null) { 
      imageLoader.get(urlThumbnail, new ImageLoader.ImageListener() { 
       @Override 
       public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { 
        holder.movieThumbnail.setImageBitmap(response.getBitmap()); 
       } 

       @Override 
       public void onErrorResponse(VolleyError error) { 

       } 
      }); 
     } 
    } 


    @Override 
    public int getItemCount() { 
     return mlistMovies.size(); 
    } 

    @Override 
    public void onError(Ad ad, AdError adError) { 

    } 

    @Override 
    public void onAdLoaded(Ad ad) { 


    } 

    @Override 
    public void onAdClicked(Ad ad) { 
     L.m("Ads is loaded, Jeez man that is good"); 
     System.out.println("Loaded in fragment"); 
     nativeAd = manager.nextNativeAd(); 

     nativeAd.setAdListener(this); 



    } 
    @Override 
    public int getItemViewType(int position) { 
     int viewType = 0; 
     if (position % 5 == 1) 
      viewType = 2; 
     return viewType; 
    } 

    @Override 
    public void onAdsLoaded() { 
     L.m("Ads is loaded, Jeez man that is good"); 
     System.out.println("Loaded in fragment"); 
     nativeAd = manager.nextNativeAd(); 

     nativeAd.setAdListener(this); 


    } 

    @Override 
    public void onAdError(AdError adError) { 

    } 

    class NativeAdViewHolder extends RecyclerView.ViewHolder { 
     private ImageView nativeAdIcon; 
     private TextView nativeAdTitle; 
     private TextView nativeAdBody; 
     private MediaView nativeAdMedia; 
     private TextView nativeAdSocialContext; 
     private Button nativeAdCallToAction; 
     private LinearLayout adview; 


     public NativeAdViewHolder(View itemView) { 
      super(itemView); 

// Create native UI using the ad metadata. 
      nativeAdIcon = (ImageView) itemView.findViewById(R.id.native_ad_icon); 
      nativeAdTitle = (TextView) itemView.findViewById(R.id.native_ad_title); 
      nativeAdBody = (TextView) itemView.findViewById(R.id.native_ad_body); 
      nativeAdMedia = (MediaView) itemView.findViewById(R.id.native_ad_media); 
      nativeAdSocialContext = (TextView) itemView.findViewById(R.id.native_ad_social_context); 
      nativeAdCallToAction = (Button) itemView.findViewById(R.id.native_ad_call_to_action); 
      adview=(LinearLayout) itemView.findViewById(R.id.ads_unit); 


     } 
    } 


    class ViewHolderBoxOffice extends RecyclerView.ViewHolder implements View.OnClickListener { 
     private ImageView movieThumbnail; 
     private TextView movieTitle; 
     private TextView movieReleaseDate; 
     private RatingBar movieAudienceScore; 

     public ViewHolderBoxOffice(View itemView) { 
      super(itemView); 
      itemView.setOnClickListener(this); 
      movieThumbnail = (ImageView) itemView.findViewById(R.id.movieThumbnail); 
      movieTitle = (TextView) itemView.findViewById(R.id.movieTitle); 
      movieReleaseDate = (TextView) itemView.findViewById(R.id.movieReleaseDate); 
      movieAudienceScore = (RatingBar) itemView.findViewById(R.id.movieAudienceScore); 


     } 

這是錯誤。

01-31 16:30:48.944 9429-9429/comeagain.materialdesign E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: comeagain.materialdesign, PID: 9429 
                     java.lang.ClassCastException: comeagain.materialdesign.adapters.AdapterBoxOffice$ViewHolderBoxOffice cannot be cast to comeagain.materialdesign.adapters.AdapterBoxOffice$NativeAdViewHolder 
                      at comeagain.materialdesign.adapters.AdapterBoxOffice.onBindViewHolder(AdapterBoxOffice.java:148) 
                      at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5217) 

錯誤是在行

NativeAdViewHolder mHolder=(NativeAdViewHolder)holder; 

我無法確定是什麼問題以及如何解決這個問題。請幫助。

回答

2

終止您的開關案件休息。

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    switch (holder.getItemViewType()) { 
     case 0: 
      ViewHolderBoxOffice v_holder = (ViewHolderBoxOffice) holder; 
      Movie currentMovie = mlistMovies.get(position); 
      v_holder.movieTitle.setText(currentMovie.getTitle()); 
      Date movieReleaseDate = currentMovie.getReleaseDateTheater(); 
      if (movieReleaseDate != null) { 
       String formmattedDate = dateFormat.format(movieReleaseDate); 
       v_holder.movieReleaseDate.setText(formmattedDate); 
      } else { 
       v_holder.movieReleaseDate.setText(Constants.NA); 

      } 
      int audienceScore = currentMovie.getAudienceScore(); 
      if (audienceScore == -1) { 
       v_holder.movieAudienceScore.setRating(0.0F); 
       v_holder.movieAudienceScore.setAlpha(0.5F); 
      } else { 
       v_holder.movieAudienceScore.setRating(currentMovie.getAudienceScore()/20.0F); 
       v_holder.movieAudienceScore.setAlpha(1.0F); 
      } 
      String urlThumbnail = currentMovie.getUrlThumbnail(); 
      loadImages(urlThumbnail, v_holder); 
      break; 
     case 2: 
      NativeAdViewHolder mHolder=(NativeAdViewHolder)holder; 
      // Setting the Text. 

      nativeAd.unregisterView(); 
      mHolder.nativeAdCallToAction.setText(nativeAd.getAdCallToAction()); 
      mHolder.nativeAdSocialContext.setText(nativeAd.getAdSocialContext()); 
      mHolder.nativeAdTitle.setText(nativeAd.getAdTitle()); 
      mHolder.nativeAdBody.setText(nativeAd.getAdBody()); 

      // Downloading and setting the ad icon. 
      NativeAd.Image adIcon = nativeAd.getAdIcon(); 
      NativeAd.downloadAndDisplayImage(adIcon, mHolder.nativeAdIcon); 

      // Download and setting the cover image. 
      NativeAd.Image adCoverImage = nativeAd.getAdCoverImage(); 
      mHolder.nativeAdMedia.setNativeAd(nativeAd); 


      // Add adChoices icon 

      // if (adChoicesView == null) 

      if(! (mHolder.adview.getChildAt(0) instanceof AdChoicesView)){ 
       AdChoicesView adChoicesView = new AdChoicesView(layoutInflater.getContext(), nativeAd, true); 

       mHolder.adview.addView(adChoicesView, 0); 
      } 

      nativeAd.registerViewForInteraction(mHolder.adview); 
      break; 
      default: 
       break; 
    } 
    if (position > previousPosition) { 
     comeagain.materialdesign.anim.AnimationUtils.animate(holder, true); 

    } else { 
     comeagain.materialdesign.anim.AnimationUtils.animate(holder, false); 

    } 
    previousPosition = position; 

} 

下一次使用debbuger來找到這樣的東西。

相關問題