3

Je gonfle deux types de vues pour un chat, dans Mon autre activité appelée ActivityA fonctionne très bien mais, dans mon activité BI utiliser le même processus, mais cela ne fonctionne pasjava.lang.InstantiationException, instanciation RecyclerView.ViewHolder

Un problème se produit dans le conteneur OnCreateView Dans la partie de 'return super.onCreateViewHolder (parent, viewType);' Code pertinent:

 private void setUpAdapter(){ 

    mAdapter = new FirebaseRecyclerAdapter<GroupalChat, RecyclerView.ViewHolder>(GroupalChat.class, R.layout.dumb_layout, RecyclerView.ViewHolder.class, FirebaseUtils.getGrupalChatRef(mPost.getId())) { 
     @Override 
     protected void populateViewHolder(RecyclerView.ViewHolder viewHolder, GroupalChat model, int position) { 
      switch(model.getType()){ 
       case CHAT_RIGHT: 
        populateViewHolder((ChatGroupalHolderSender) viewHolder, model ,position); 
        break; 
       case CHAT_LEFT: 
        populateViewHolder((ChatGroupalHolderGetter) viewHolder, model ,position); 
        break; 
      } 
     } 

     @Override 
     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      switch(viewType){ 

       case CHAT_RIGHT: 
        View sender = LayoutInflater.from(getApplicationContext()).inflate(R.layout.chat_grupal_sender, parent, false); 
        return new ChatGroupalHolderSender(sender); 
       case CHAT_LEFT: 
        View left = LayoutInflater.from(getApplicationContext()).inflate(R.layout.chat_grupal_getter, parent, false); 
        return new ChatGroupalHolderGetter(left); 
      } 
      return super.onCreateViewHolder(parent, viewType); 

     } 

     @Override 
     public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, int position) { 
      GroupalChat item = getItem(position); 
      int itemViewType = getItemViewType(position); 
      switch (itemViewType){ 
       case CHAT_RIGHT: 
        FirebaseUtils.getUsuarioReferencia(firebaseUser.getUid()).child(firebaseUser.getUid()).child("username").addListenerForSingleValueEvent(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          if(dataSnapshot.getValue(String.class) != null){ 
           String name = dataSnapshot.getValue(String.class); 
           ((ChatGroupalHolderSender) viewHolder).mNombrePerfil.setText(name); 
          } 

         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 

        FirebaseUtils.getUsuarioReferencia(firebaseUser.getUid()).child(firebaseUser.getUid()).child("photoUrl").addListenerForSingleValueEvent(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          if(dataSnapshot.getValue(String.class) != null){ 
           String url = dataSnapshot.getValue(String.class); 
           StorageReference storageReference = FirebaseStorage.getInstance().getReference(url); 
           Glide.with(GroupChatActivity.this).using(new FirebaseImageLoader()).load(storageReference).into(((ChatGroupalHolderSender) viewHolder).mFotoPerfil); 
          } 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 

        ((ChatGroupalHolderSender) viewHolder).mTexto.setText(item.getMessage()); 
        ((ChatGroupalHolderSender) viewHolder).mFecha.setText(DateUtils.getRelativeTimeSpanString(item.getTiempoMensaje())); 
        break; 

       // GETTER 
       case CHAT_LEFT: 
        FirebaseUtils.getUsuarioReferencia(item.getUID()).child(item.getUID()).child("username").addListenerForSingleValueEvent(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          if(dataSnapshot.getValue(String.class) != null){ 
           String name = dataSnapshot.getValue(String.class); 
           ((ChatGroupalHolderGetter) viewHolder).mNombrePerfil.setText(name); 
          } 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 

        FirebaseUtils.getUsuarioReferencia(item.getUID()).child(item.getUID()).child("photoUrl").addListenerForSingleValueEvent(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          if(dataSnapshot.getValue(String.class) != null){ 
           String url = dataSnapshot.getValue(String.class); 
           StorageReference storageReference = FirebaseStorage.getInstance().getReference(url); 
           Glide.with(GroupChatActivity.this).using(new FirebaseImageLoader()).load(storageReference).into(((ChatGroupalHolderGetter) viewHolder).mFotoPerfil); 
          } 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 
        ((ChatGroupalHolderGetter) viewHolder).mTexto.setText(item.getMessage()); 
        ((ChatGroupalHolderGetter) viewHolder).mFecha.setText(DateUtils.getRelativeTimeSpanString(item.getTiempoMensaje())); 
        break; 

      } 

     } 




    }; 

} 

mes ViewHolders

public static class ChatGroupalHolderGetter extends RecyclerView.ViewHolder{ 

    private CircleImageView mFotoPerfil; 
    private TextView mNombrePerfil, mFecha, mTexto; 

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

     mFotoPerfil = (CircleImageView) itemView.findViewById(R.id.fotoPerfilChatGrupalG); 

     mNombrePerfil = (TextView) itemView.findViewById(R.id.nombreUsuarioChatGrupalG); 
     mFecha = (TextView) itemView.findViewById(R.id.horaChatGrupalG); 
     mTexto = (TextView) itemView.findViewById(R.id.textoDeChatGrupalG); 


    } 
} 



public static class ChatGroupalHolderSender extends RecyclerView.ViewHolder{ 

    private CircleImageView mFotoPerfil; 
    private TextView mNombrePerfil, mFecha, mTexto; 

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

     mFotoPerfil = (CircleImageView) itemView.findViewById(R.id.fotoPerfilChatGrupal); 

     mNombrePerfil = (TextView) itemView.findViewById(R.id.nombreUsuarioChatGrupal); 
     mFecha = (TextView) itemView.findViewById(R.id.horaChatGrupal); 
     mTexto = (TextView) itemView.findViewById(R.id.textoDeChatGrupal); 

    } 
} 

l'exception:

FATAL EXCEPTION: main 
                     Process: com.octacorp.octa.strank, PID: 22549 
                     Theme: themes:{} 
                     java.lang.RuntimeException: java.lang.InstantiationException: Can't instantiate abstract class android.support.v7.widget.RecyclerView$ViewHolder 
                      at com.firebase.ui.database.FirebaseRecyclerAdapter.onCreateViewHolder(FirebaseRecyclerAdapter.java:176) 
                      at com.octacorp.octa.strank.ui.parties.parties.GroupChatActivity$4.onCreateViewHolder(GroupChatActivity.java:170) 
                      at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6367) 
                      at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5555) 
                      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:570) 
                      at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3583) 
                      at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3025) 
                      at android.view.View.measure(View.java:18799) 
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1458) 
                      at android.widget.LinearLayout.measureVertical(LinearLayout.java:746) 
                      at android.widget.LinearLayout.onMeasure(LinearLayout.java:629) 
                      at android.view.View.measure(View.java:18799) 
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
                      at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139) 
                      at android.view.View.measure(View.java:18799) 
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1458) 
                      at android.widget.LinearLayout.measureVertical(LinearLayout.java:746) 
                      at android.widget.LinearLayout.onMeasure(LinearLayout.java:629) 
                      at android.view.View.measure(View.java:18799) 
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
                      at android.view.View.measure(View.java:18799) 
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1458) 
                      at android.widget.LinearLayout.measureVertical(LinearLayout.java:746) 
                      at android.widget.LinearLayout.onMeasure(LinearLayout.java:629) 
                      at android.view.View.measure(View.java:18799) 
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
                      at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2899) 
                      at android.view.View.measure(View.java:18799) 
                      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2108) 
                      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1224) 
                      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1460) 
                      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1115) 
                      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6023) 
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
                      at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
                      at android.view.Choreographer.doFrame(Choreographer.java:606) 
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
                      at android.os.Handler.handleCallback(Handler.java:739) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:148) 

Je ne sais pas ce qu'il peut être puisque dans mon activtyA cela fonctionne à merveille

+0

d'abord je me demande comment pouvez-vous appeler super.onCreateViewHolder (parent, viewType); parce que c'est une méthode abstraite en super classe –

+0

J'écrase la classe @AbdulWaheed –

+0

vous êtes en train de surcharger mais en utilisant une implémentation super classe –

Répondre

2

Il est un problème dans cette méthode: -

@Override 
     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      switch(viewType){ 

       case CHAT_RIGHT: 
        View sender = LayoutInflater.from(getApplicationContext()).inflate(R.layout.chat_grupal_sender, parent, false); 
        return new ChatGroupalHolderSender(sender); 
       case CHAT_LEFT: 
        View left = LayoutInflater.from(getApplicationContext()).inflate(R.layout.chat_grupal_getter, parent, false); 
        return new ChatGroupalHolderGetter(left); 
      } 
      **return super.onCreateViewHolder(parent, viewType);** 

     } 

As Dans quel cas exactement votre onCreateViewHolder est requis pour créer le conteneur de vues du parent. Votre parent a un type de classe ViewHolder pour RecyclerView.ViewHolder, qui est abstrait et ne peut donc pas être initialisé. Vous devez vous assurer ViewHolder est toujours créé par votre mise en œuvre soit vous pouvez faire comme ceci: -

@Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     switch(viewType){ 

      case CHAT_RIGHT: 
       View sender = LayoutInflater.from(getApplicationContext()).inflate(R.layout.chat_grupal_sender, parent, false); 
       return new ChatGroupalHolderSender(sender); 
      default: 
       View left = LayoutInflater.from(getApplicationContext()).inflate(R.layout.chat_grupal_getter, parent, false); 
       return new ChatGroupalHolderGetter(left); 
     } 


    } 

Ou meilleure solution est d'abord, vous devez passer outre

@Override 
    public int getItemViewType(int position) { 
     //Always return from handle type in switch block ** onCreateViewHolder** 
     return CHAT_RIGHT || CHAT_LEFT; 
    } 

qui vous assurer que vous toujours obtenir le type de vue soit CHAT_RIGHT ou CHAT_LEFT. Espérons que cela résoudra votre problème.

+0

Je ne sais pas ce que j'ai fait pour être honnête, copiez et collez la classe qui a fonctionné et qui a fonctionné mais votre réponse c'est très bien! merci beaucoup –

+0

Si vous avez des doutes, je peux l'expliquer ici et si la solution a fonctionné pour vous s'il vous plaît accepter la réponse. – Avi