0

Je suis this tutoriel pour mettre en œuvre plusieurs sélectionnez dans mon RecyclerView mais j'ai été faire l'exception d'exécution suivante lorsque j'effectue un long clic:ClassCastException dans onLongClick de ViewHolder

java.lang.ClassCastException: com.abdralabs.talksee.MyApplication cannot be cast to android.support.v7.app.AppCompatActivity 
                     at com.abdralabs.talksee.IMListAdapter$IMListViewHolder.onLongClick(IMListAdapter.java:116) 
                     at android.view.View.performLongClick(View.java:5308) 
                     at android.view.View$CheckForLongPress.run(View.java:21522) 
                     at android.os.Handler.handleCallback(Handler.java:815) 
                     at android.os.Handler.dispatchMessage(Handler.java:104) 
                     at android.os.Looper.loop(Looper.java:207) 
                     at android.app.ActivityThread.main(ActivityThread.java:5740) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:766) 

Code d'activité:

public class IMListActivity extends AppCompatActivity implements Sertivity{ 

private RecyclerView recyclerView; 
private IMListAdapter imListAdapter; 
private List<Chat> chatList = new ArrayList<>(); 
List<String> stringList; 
ActiveChatsDB activeChatsDB; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_imlist); 
    Toolbar toolbar = (Toolbar)findViewById(R.id.imlist_toolbar); 
    setSupportActionBar(toolbar); 
    setBackButtonOnToolbar(); 

    recyclerView = (RecyclerView)findViewById(R.id.rv_im_list); 
    imListAdapter = new IMListAdapter(chatList, getApplicationContext()); 
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setItemAnimator(new DefaultItemAnimator()); 
    recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL)); 
    recyclerView.setAdapter(imListAdapter); 
    prepareChatListData(); 
} 

private void prepareChatListData() { 
    String friend; 
    String latestMessage; 
    activeChatsDB = new ActiveChatsDB(IMListActivity.this); 
    stringList = activeChatsDB.getChatList(); 
    activeChatsDB.close(); 
    for (int i=0; i<stringList.size(); i++) { 
     friend = stringList.get(i); 
     DBAct dbAct = new DBAct(IMListActivity.this,friend); 
     latestMessage = dbAct.getLatestMessage(); 
     dbAct.close(); 
     Chat chat = new Chat(friend, latestMessage); 
     chatList.add(chat); 
    } 
    imListAdapter.notifyDataSetChanged(); 
} 

private void setBackButtonOnToolbar(){ 
    if(getSupportActionBar() != null){ 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
    } 
} 



public RecyclerView getRecyclerView() { 
    return recyclerView; 
} 

}

code Adaptateur:

public class IMListAdapter extends RecyclerView.Adapter <com.abdralabs.talksee.IMListAdapter.IMListViewHolder> { 

private List<Chat> chatList = new ArrayList<Chat>() ; 
private Context ctx; 
private MultiSelector multiSelector = new MultiSelector(); 
private ModalMultiSelectorCallback modalMultiSelectorCallback = 
     new ModalMultiSelectorCallback(multiSelector) { 
      @Override 
      public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
       if (item.getItemId() == R.id.item_delete) { 
        mode.finish(); 

        for (int i = chatList.size(); i >= 0; i--) { 
         if (multiSelector.isSelected(i, 0)) { // (1) 
          // remove item from list 
          ((IMListActivity)ctx).getRecyclerView().getAdapter().notifyItemRemoved(i); 
         } 
        } 

        multiSelector.clearSelections(); // (2) 
        return true; 

       } 
       return false; 
      } 

      @Override 
      public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { 
       super.onCreateActionMode(actionMode, menu); 
       ((AppCompatActivity)ctx).getMenuInflater().inflate(R.menu.contextual_menu_friends, menu); 
       return true; 
      } 
     }; 

public IMListAdapter(List<Chat> chatList, Context ctx){ 
    this.chatList = chatList; 
    this.ctx = ctx; 
} 


@Override 
public com.abdralabs.talksee.IMListAdapter.IMListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_list_row,parent,false); 
    return new com.abdralabs.talksee.IMListAdapter.IMListViewHolder(itemView, chatList, ctx); } 

@Override 
public void onBindViewHolder(com.abdralabs.talksee.IMListAdapter.IMListViewHolder holder, int position) { 
    Chat chat = chatList.get(position); 
    holder.name.setText(chat.getName()); 
    holder.recentMsg.setText(chat.getRecentMessage()); 
} 

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

public class IMListViewHolder extends SwappingHolder implements View.OnClickListener, View.OnLongClickListener{ 
    public TextView name; 
    public TextView recentMsg; 
    List<Chat> chatList = new ArrayList<Chat>(); 
    Context ctx; 

    public IMListViewHolder(View itemView, List<Chat> chatList, Context ctx) { 
     super(itemView, multiSelector); 
     this.chatList = chatList; 
     this.ctx = ctx; 
     itemView.setOnClickListener(this); 
     itemView.setOnLongClickListener(this); 
     itemView.setLongClickable(true); 
     name = (TextView) itemView.findViewById(R.id.name_chat); 
     recentMsg = (TextView)itemView.findViewById(R.id.tv_recent_msg_im_list); 
    } 

    @Override 
    public void onClick(View v) { 
     int position = getAdapterPosition(); 
     Chat chat = this.chatList.get(position); 
     Intent intent = new Intent(this.ctx, IMActivity.class); 
     intent.putExtra("otherUserName",chat.getName()); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     this.ctx.startActivity(intent); 


    } 

    @Override 
    public boolean onLongClick(View v) { 
     if (!multiSelector.isSelectable()) { // (3) 
      ((AppCompatActivity)ctx).startSupportActionMode(modalMultiSelectorCallback); 
      multiSelector.setSelectable(true); // (4) 
      multiSelector.setSelected(com.abdralabs.talksee.IMListAdapter.IMListViewHolder.this, true); // (5) 
      return true; 
     } 
     return false; 
    } 
} 

}

Je ne sais pas comment je suis censé effectuer le moulage de type correct. S'il vous plaît aider.

EDIT 1:

J'ai essayé de remplacer le code onLongClick à

public boolean onLongClick(View v) { 
     if (!multiSelector.isSelectable()) { // (3) 
      ((IMListActivity)ctx).startSupportActionMode(modalMultiSelectorCallback); 
      multiSelector.setSelectable(true); // (4) 
      multiSelector.setSelected(IMListViewHolder.this, true); // (5) 
      return true; 
     } 
     return false; 
    } 

comme Sachin Bahukhandi suggéré, mais je me fais la même erreur

java.lang.ClassCastException: com.abdralabs.talksee.MyApplication cannot be cast to com.abdralabs.talksee.IMListActivity 
                    at com.abdralabs.talksee.IMListAdapter$IMListViewHolder.onLongClick(IMListAdapter.java:116) 
                    at android.view.View.performLongClick(View.java:5308) 
                    at android.view.View$CheckForLongPress.run(View.java:21522) 
                    at android.os.Handler.handleCallback(Handler.java:815) 
                    at android.os.Handler.dispatchMessage(Handler.java:104) 
                    at android.os.Looper.loop(Looper.java:207) 
                    at android.app.ActivityThread.main(ActivityThread.java:5740) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:766) 

Dans le tutorial que je suis le code est en tant que tel:

@Override 
public boolean onLongClick(View view) { 
    if (!mMultiSelector.isSelectable()) { 
     ((AppCompatActivity) getActivity()).startSupportActionMode(mActionModeCallback); // (2) 
     mMultiSelector.setSelectable(true); 
     mMultiSelector.setSelected(MyViewHolder.this, true); 
     return true; 
    } 
    return false; 
} 

Dans le code ci-dessus, getActivity est appelé d'une manière ou d'une autre à partir du Viewholder et est converti en AppCompatActivity. Je ne sais pas comment appeler getActivity directement à partir de ViewHolder depuis que je reçois et erreur donc j'ai essayé de taper cast un objet de contexte (qui a été passé de mon activité à travers le constructeur de l'adaptateur) à AppCompatActivity. Donc, je ne sais pas exactement ce que je fais mal ici.

Répondre

0

Je résolu ce problème en passant la référence d'activité au constructeur de l'adaptateur et appeler

imListActivity.startSupportActionMode(modalMultiSelectorCallback); 

au lieu de le faire

((IMListActivity)ctx).startSupportActionMode(modalMultiSelectorCallback); 
0

Dans le code que vous avez publié l'application a planté car il ne peut pas diffuser Context à AppCompatActivity.

@Override 
public boolean onLongClick(View v) { 
    if (!multiSelector.isSelectable()) { // (3) 
     ((AppCompatActivity)ctx).startSupportActionMode(modalMultiSelectorCallback); 
     multiSelector.setSelectable(true); // (4) 
     multiSelector.setSelected(com.abdralabs.talksee.IMListAdapter.IMListViewHolder.this, true); // (5) 
     return true; 
    } 
    return false; 
} 

Je suggère donc de remplacer

((AppCompatActivity)ctx).startSupportActionMode(modalMultiSelectorCallback); 
     multiSelector.setSelectable(true); // (4) 

Pour YourActivity:

((IMListActivity)ctx).startSupportActionMode(modalMultiSelectorCallback); 
     multiSelector.setSelectable(true); // (4) 

Hope this helps.

+0

J'ai modifié la question en réponse à votre réponse. –

+0

Cela vous a-t-il aidé? –

+0

Non. Malheureusement, je suis confronté à la même erreur que celle que j'ai mise à jour dans l'EDIT 1 de ma question. –