-2

我'試圖創建一個自定義RecyclerView,當我運行的應用程序如何解決這個問題拋出ClassCastException在CustomRecyclerViewAdapter?

07-17 13:14:55.474 17285-17285/com.abdallahmurad.recyclerview E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.abdallahmurad.recyclerview, PID: 17285 
                      java.lang.ClassCastException: com.abdallahmurad.recyclerview.CustomRecyclerAdapter$AdHolder cannot be cast to com.abdallahmurad.recyclerview.CustomRecyclerAdapter$ProfileHolder 
                       at com.abdallahmurad.recyclerview.CustomRecyclerAdapter.onBindViewHolder(CustomRecyclerAdapter.java:47) 
                       at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6356) 
                       at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6389) 
                       at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5335) 
                       at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5598) 
                       at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5440) 
                       at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5436) 
                       at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2224) 
                       at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1551) 
                       at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511) 
                       at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595) 
                       at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3583) 
                       at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3312) 
                       at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3844) 
                       at android.view.View.layout(View.java:17972) 
                       at android.view.ViewGroup.layout(ViewGroup.java:5814) 
                       at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080) 
                       at android.view.View.layout(View.java:17972) 
                       at android.view.ViewGroup.layout(ViewGroup.java:5814) 
                       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344) 
                       at android.widget.FrameLayout.onLayout(FrameLayout.java:281) 
                       at android.view.View.layout(View.java:17972) 
                       at android.view.ViewGroup.layout(ViewGroup.java:5814) 
                       at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:437) 
                       at android.view.View.layout(View.java:17972) 
                       at android.view.ViewGroup.layout(ViewGroup.java:5814) 
                       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344) 
                       at android.widget.FrameLayout.onLayout(FrameLayout.java:281) 
                       at android.view.View.layout(View.java:17972) 
                       at android.view.ViewGroup.layout(ViewGroup.java:5814) 
                       at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1742) 
                       at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) 
                       at android.widget.LinearLayout.onLayout(LinearLayout.java:1494) 
                       at android.view.View.layout(View.java:17972) 
                       at android.view.ViewGroup.layout(ViewGroup.java:5814) 
                       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344) 
                       at android.widget.FrameLayout.onLayout(FrameLayout.java:281) 
                       at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:3129) 
                       at android.view.View.layout(View.java:17972) 
                       at android.view.ViewGroup.layout(ViewGroup.java:5814) 
                       at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2715) 
                       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2416) 
                       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1486) 
                       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7467) 
                       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920) 
                       at android.view.Choreographer.doCallbacks(Choreographer.java:695) 
                       at android.view.Choreographer.doFrame(Choreographer.java:631) 
                       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906) 
                       at android.os.Handler.handleCallback(Handler.java:739) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:158) 
                       at android.app.ActivityThread.main(ActivityThread.java:7231) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                       at com.android. 

我一直歌廳這個異常**,這是自定義適配器,我用我的RecyclerView **

public class CustomRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
private Context context; 
private List<Employee> employeeList; 
private int layout; 

public CustomRecyclerAdapter(Context context, List<Employee> employeeList, int layout) { 
    this.context = context; 
    this.employeeList = employeeList; 
    this.layout = layout; 
} 


@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    if (viewType == 777) { 
     return new ProfileHolder(LayoutInflater.from(context).inflate(layout, parent, false)); 
    } else { 
     return new AdHolder(LayoutInflater.from(context).inflate(layout, parent, false)); 
    } 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    int viewType = getItemViewType(position); 
    if (viewType == 777) { 
     AdHolder adHolder = (AdHolder) holder; 
    } else { 
     ProfileHolder profileHolder = (ProfileHolder) holder; 
     profileHolder.profileImage.setImageResource(employeeList.get(position).getProfileImageId()); 
     profileHolder.nameTV.setText(employeeList.get(position).getName()); 
     profileHolder.ageTV.setText(employeeList.get(position).getAge()); 

     if (viewType == 666) { 
      profileHolder.nameTV.setBackgroundColor(R.color.md_blue_grey_300); 
      profileHolder.ageTV.setBackgroundColor(R.color.md_blue_grey_200); 
      profileHolder.profileLayout.setBackgroundColor(R.color.md_teal_500); 
     } 
    } 

} 

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


@Override 
public int getItemViewType(int position) { 
    if (position == 3) { 
     return 666; 
    } else if (position == 5) { 
     return 777; 
    } 
    return super.getItemViewType(position); 
} 

public class ProfileHolder extends RecyclerView.ViewHolder { 
    ImageView profileImage; 
    TextView nameTV; 
    TextView ageTV; 
    Button deleteBtn; 
    RelativeLayout profileLayout; 

    public ProfileHolder(View itemView) { 
     super(itemView); 
     profileImage = (ImageView) itemView.findViewById(R.id.profile_image); 
     nameTV = (TextView) itemView.findViewById(R.id.name); 
     ageTV = (TextView) itemView.findViewById(R.id.age); 
     deleteBtn = (Button) itemView.findViewById(R.id.deleteBtn); 
     profileLayout = (RelativeLayout) itemView.findViewById(R.id.relativeLayout); 
     deleteBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Toast.makeText(v.getContext(), employeeList.get(getAdapterPosition()).getName() + " : " + ageTV.getText(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
} 

public class AdHolder extends RecyclerView.ViewHolder { 

    public AdHolder(View itemView) { 
     super(itemView); 
    } 
} 

}

所以我的問題是

1 whay我能得到這個例外?

2 - 我該如何解決

+0

這可能是因爲你的觀點首先是廣告容器, ,然後您試圖將其「投射」到ProfileHolder,這會導致錯誤。 –

+0

我試圖做財產以後這樣的:http://www.hendiware.com/wp-content/uploads/2016/09/img_57dde7ab0e5b2-576x1024.png –

回答

0

您與AdHolderonCreateViewHolder()

創建爲切換ProfileHolder,但在onBindViewHolder你把它轉換爲AdHolder時它是777.所以這其中有一個是錯誤的。

1

1 whay我能得到這個例外?

因爲你想投錯類。

我該如何解決

控制類鑄件之前。

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    int viewType = getItemViewType(position); 
    if (holder instanceof AdHolder) { 
     AdHolder adHolder = (AdHolder) holder; 
    } else { 
     ProfileHolder profileHolder = (ProfileHolder) holder; 
     profileHolder.profileImage.setImageResource(employeeList.get(position).getProfileImageId()); 
     profileHolder.nameTV.setText(employeeList.get(position).getName()); 
     profileHolder.ageTV.setText(employeeList.get(position).getAge()); 

     if (viewType == 666) { 
      profileHolder.nameTV.setBackgroundColor(R.color.md_blue_grey_300); 
      profileHolder.ageTV.setBackgroundColor(R.color.md_blue_grey_200); 
      profileHolder.profileLayout.setBackgroundColor(R.color.md_teal_500); 
     } 
    } 

} 
0

onBindViewHolder()if (viewType == 777)你傳遞ProfileHolder和onBindVIewHolder當viewType = 777你就這樣做

if (viewType == 777) { AdHolder adHolder = (AdHolder) holder; }

變化

if (viewType == 777) { 
    ProfileHolder profileviewholder = (ProfileHolder) holder; 
}