3

ich zwei Arten von Ansichten für einen Chat in, in Meiner anderen Aktivität genannt ACTIVITYA funktioniert gut, aber meine Tätigkeit BI verwendet den gleichen Prozess am aufblasen, aber es funktioniert nichtjava.lang.InstantiationException, Instanziieren RecyclerView.ViewHolder

Problem tritt in OnCreateView Inhaber In dem Teil von 'return super.onCreateViewHolder (übergeordnete, viewType);' Relevante Code:

 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; 

      } 

     } 




    }; 

} 

mein 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); 

    } 
} 

die Ausnahme:

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) 

Ich weiß nicht, was es in meinem activtyA da sein kann wunderbar

+0

zuerst frage ich mich, wie Sie super.onCreateViewHolder (parent, viewType) aufrufen können; weil es eine abstrakte Methode in der Superklasse ist –

+0

Ich überschreibe die Klasse @AbdulWaheed –

+0

Sie überschreiben, aber mit Super-Klasse-Implementierung –

Antwort

2

funktioniert Es ist ein Problem bei dieser Methode: -

Als In diesem Fall genau Ihre onCreateViewHolder erforderlich, um Ansichtshalter aus dem übergeordneten erstellen. Ihre Eltern haben den ViewHolder-Klassentyp für RecyclerView.ViewHolder, was abstrakt ist und daher nicht initialisiert werden kann. Sie müssen sicherstellen, dass ViewHolder machen wird immer durch Ihre Implementierung erstellt entweder Sie können wie folgt vorgehen: -

@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); 
     } 


    } 

Oder bessere Lösung ist Zuerst Sie

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

außer Kraft setzen müssen, die sicherstellen, werden Sie immer view type entweder CHAT_RIGHT oder CHAT_LEFT. Ich hoffe, es wird Ihr Problem lösen.

+0

Ich weiß nicht, was ich getan habe, um ehrlich zu sein, kopieren und fügen Sie die Klasse, die funktionierte und arbeitete aber Ihre Antwort ist sehr gut! Vielen Dank –

+0

Wenn Sie irgendwelche Zweifel haben, kann ich es hier erklären und wenn die Lösung für Sie arbeitete, bitte akzeptieren Sie die Antwort. – Avi

Verwandte Themen