0

I have been trying for last 4 hours to narrow down the view holder issue but cant seem to find it. I've been following and copying this code. Friendly Chat - Android

But still no hope. I've been getting

"java.lang.RuntimeException: java.lang.reflect.InvocationTargetException"

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.firebase.ui.database.FirebaseRecyclerAdapter.onCreateViewHolder(FirebaseRecyclerAdapter.java:167)
at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:5482)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4707)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:549)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2906)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3283)
at android.view.View.layout(View.java:15686)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15686)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15686)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15686)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15686)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15686)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15686)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5891)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:550)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5292)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
at com.firebase.ui.database.FirebaseRecyclerAdapter.onCrea

View Holder

public class MessageActivity extends AppCompatActivity {

public static class MessageViewHolder extends RecyclerView.ViewHolder {
    public TextView messageTextView;
    public TextView messengerTextView;
    public CircleImageView messengerImageView;

    public MessageViewHolder(View itemView) {
        super(itemView);
        messageTextView = (TextView) itemView.findViewById(R.id.messageTextView);
        messengerTextView = (TextView) itemView.findViewById(R.id.messengerTextView);
        messengerImageView = (CircleImageView) itemView.findViewById(R.id.messengerImageView);
    }
   .....
}

Creating adapter

mFirebaseAdapter = new FirebaseRecyclerAdapter<Message, MessageViewHolder>(
            Message.class,
            R.layout.item_message,
            MessageViewHolder.class,
            mFirebaseDatabaseReference.child(MESSAGES_CHILD)) {

        @Override
        protected void populateViewHolder(MessageViewHolder viewHolder, Message friendlyMessage, int position) {
            viewHolder.messageTextView.setText(friendlyMessage.getText());
            viewHolder.messengerTextView.setText(friendlyMessage.getName());
            if (friendlyMessage.getPhotoUrl() == null) {
                viewHolder.messengerImageView.setImageDrawable(ContextCompat.getDrawable(MessageActivity.this,
                        R.drawable.profilepic_placeholder));
            } else {
                Glide.with(MessageActivity.this)
                        .load(friendlyMessage.getPhotoUrl())
                        .into(viewHolder.messengerImageView);
            }
        }
    };

Setting Adapter

 mMessageRecyclerView.setLayoutManager(mLinearLayoutManager);
 mMessageRecyclerView.setAdapter(mFirebaseAdapter);

Once I start the activity, within few seconds app crashes :( and throws that InvocationTargetException

Edit
Libraries that I am using

compile 'com.google.firebase:firebase-database:9.4.0'
compile 'com.google.firebase:firebase-messaging:9.4.0'
compile 'com.firebaseui:firebase-ui-database:0.5.3'
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
Alex
  • 1,052
  • 1
  • 11
  • 22
  • The same call stack appears in this [FirebaseUI issue](https://github.com/firebase/FirebaseUI-Android/issues/94). Maybe you'll understand the resolution there. I don't. Also, the [setup instructions for FirebaseUI](https://github.com/firebase/FirebaseUI-Android) indicate you should be using UI version 0.4.4 or 0.5.3 with Database version 9.4.0 – Bob Snyder Sep 12 '16 at 05:25
  • @qbix - Yes, I already read that issue in github. I tried changing my view holder to static/non-static, public/private, even tried making view holder to a separate stand alone class, still failing :( also updated ui libraries – Alex Sep 12 '16 at 05:39
  • [This is the line that's raising the exception](https://github.com/firebase/FirebaseUI-Android/blob/0.5.3/database/src/main/java/com/firebase/ui/database/FirebaseRecyclerAdapter.java#L167): `LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false)`, so it looks like it's unable to inflate your layout from the XML. – Frank van Puffelen Sep 12 '16 at 14:26

2 Answers2

0

May be you get wrong private FirebaseRecyclerAdapter mFirebaseAdapter; Double check your Values or RecyclerView, because arguments are invalid. https://stackoverflow.com/a/6020758/6821007

Edit: compile 'com.github.bumptech.glide:glide:3.5.2' and Make support some widget like RecyclerView

Community
  • 1
  • 1
0

after so much trial, it's just one piece of word that fixed it. It's 'final' keyword on my populateViewholder. Even thou my view holder is not final but still that final keyword made it work. Not sure why and how. Didn't know firebase recyclerviewadapter would be that strict

Adapter

mFirebaseAdapter = new FirebaseRecyclerAdapter<Message, MessageViewHolder>(
            Message.class,
            R.layout.item_message,
            MessageViewHolder.class,
            mFirebaseDatabaseReference.child(MESSAGES_CHILD)) {

        @Override
        protected void populateViewHolder(final MessageViewHolder viewHolder, Message friendlyMessage, int position) {
            viewHolder.messageTextView.setText(friendlyMessage.getText());
            viewHolder.messengerTextView.setText(friendlyMessage.getName());
            if (friendlyMessage.getPhotoUrl() == null) {
                viewHolder.messengerImageView.setImageDrawable(ContextCompat.getDrawable(MessageActivity.this,
                        R.drawable.profilepic_placeholder));
            } else {
                Glide.with(MessageActivity.this)
                        .load(friendlyMessage.getPhotoUrl())
                        .into(viewHolder.messengerImageView);
            }
        }
    };
Alex
  • 1,052
  • 1
  • 11
  • 22