Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LayoutInflater Exception

Here is the deal, I have a RecycleView Adapter which inflates layout on onCreateViewHolder. When I try to do the following actions in order this happens:

  1. Application created without any problem
  2. Went into multitasking window
  3. Came back to app
  4. InflateException

Error is occurring at Fresco's SimpleDraweeView which is defined in xml.

<com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/photo"
        android:layout_width="match_parent"
        android:layout_height="@dimen/image_nobar"
        android:layout_alignParentEnd="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:adjustViewBounds="true"
        android:contentDescription="@string/photo"
        fresco:placeholderImage="@drawable/fry"
        fresco:actualImageScaleType="focusCrop" />

This is how I'm setting the adapter to RecycleView

list = new ArrayList<>();
gagInfo gi = new gagInfo();
list.add(gi.setEmpty());
recList.setAdapter(new gagAdapter(list, context));
populateRecyclerView(recList);
private void populateRecyclerView(final RecyclerView rView) {

    new Thread(new Runnable() {
        @Override
        public void run() {
            SharedPreferences prefs = getSharedPreferences(GAGS, MODE_PRIVATE);

            Map<String, ?> allEntries = prefs.getAll();
            list = new ArrayList<>();
            JSONObject obj;
            String keyObject;
            Boolean first = true;
            for (Map.Entry<String, ?> entry : allEntries.entrySet()) {
                String entryValue = entry.getValue().toString();
                keyObject = entry.getKey();

                try {
                    JSONObject entryObject = new JSONObject(entryValue);
                    obj = entryObject.getJSONObject("nameValuePairs");
                    gagInfo gi = new gagInfo();
                    Log.d("JSON", "Processing... " + keyObject);

                    try {
                        gi.title = obj.getString("title");
                        gi.likes = obj.getString("likes");
                        gi.comments = obj.getString("comments");
                        gi.saved_date = obj.getString("saved_date");
                        gi.file_path = obj.getString("file_path");
                        gi.photoId = obj.getString("photoId");

                        list.add(gi);

                        if (first) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    ca = new gagAdapter(list, context);
                                    rView.setAdapter(ca);
                                }
                            });
                            first = false;
                        } else {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    ca.notifyItemInserted(list.size() - 1);
                                }
                            });
                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                        SharedPreferences.Editor editor = prefs.edit();
                        editor.remove(keyObject);
                        editor.apply();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            Collections.sort(list);
        }
    }).start();
}

I have tried to override onResume in the Activity where I set Adapter to RecycleView (Main reason: Resume from onCreate to avoid passing null Adapter):

@Override
    protected void onResume() {
        String action = getIntent().getAction();
        if (action == null || !action.equals("Created")) {
            Log.v("HCA", "Restart");
            Intent intent = new Intent(this, HomeCardActivity.class);
            startActivity(intent);
            finish();
        } else {
            getIntent().setAction(null);
        }
        super.onResume();
    }

And this is how I inflate layout in my adapter. I also tried to retry to inflate layout if it fails.

@Override
    public gagViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(viewGroup.getContext());
        String card = prefs.getString("card_view", "0");
        Integer layoutID;

        if (card.equals("0")) {
            layoutID = R.layout.card_layout;
        } else {
            layoutID = R.layout.card_layout_nowhitebar;
        }

        View itemView;
        int count = 0;
        int maxTries = 5;

        do try { //TODO: Why LayoutInflater fails after third try?
            itemView = LayoutInflater.
                    from(viewGroup.getContext()).
                    inflate(layoutID, viewGroup, false);
            if (!(itemView == null)) break;
        } catch (InflateException ie) {
            Log.e("LayoutInflater", ie.toString());
            if (++count == maxTries) throw ie;
        } while (true);

        return new gagViewHolder(itemView);
    }

Logcat

android.view.InflateException: Binary XML file line #15: Binary XML file line #15: Error inflating class <unknown>
                                                                  at android.view.LayoutInflater.inflate(LayoutInflater.java:551)
                                                                  at android.view.LayoutInflater.inflate(LayoutInflater.java:429)
                                                                  at com.denizugur.ninegagsaver.gagAdapter.onCreateViewHolder(gagAdapter.java:134)
                                                                  at com.denizugur.ninegagsaver.gagAdapter.onCreateViewHolder(gagAdapter.java:25)
                                                                  at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:5779)
                                                                  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5003)
                                                                  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4913)
                                                                  at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2029)
                                                                  at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1414)
                                                                  at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1377)
                                                                  at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:578)
                                                                  at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3260)
                                                                  at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3069)
                                                                  at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3518)
                                                                  at android.view.View.layout(View.java:17938)
                                                                  at android.view.ViewGroup.layout(ViewGroup.java:5812)
                                                                  at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080)
                                                                  at android.view.View.layout(View.java:17938)
                                                                  at android.view.ViewGroup.layout(ViewGroup.java:5812)
                                                                  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344)
                                                                  at android.widget.FrameLayout.onLayout(FrameLayout.java:281)
                                                                  at android.view.View.layout(View.java:17938)
                                                                  at android.view.ViewGroup.layout(ViewGroup.java:5812)
                                                                  at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:435)
                                                                  at android.view.View.layout(View.java:17938)
                                                                  at android.view.ViewGroup.layout(ViewGroup.java:5812)
                                                                  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344)
                                                                  at android.widget.FrameLayout.onLayout(FrameLayout.java:281)
                                                                  at android.view.View.layout(View.java:17938)
                                                                  at android.view.ViewGroup.layout(ViewGroup.java:5812)
                                                                  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:17938)
                                                                  at android.view.ViewGroup.layout(ViewGroup.java:5812)
                                                                  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:3193)
                                                                  at android.view.View.layout(View.java:17938)
                                                                  at android.view.ViewGroup.layout(ViewGroup.java:5812)
                                                                  at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2666)
                                                                  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2367)
                                                                  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1437)
                                                                  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7397)
                                                                  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:7229)
                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                                                               Caused by: android.view.InflateException: Binary XML file line #15: Error inflating class <unknown>
                                                                at android.view.LayoutInflater.createView(LayoutInfla
like image 501
Deniz da King Avatar asked Oct 30 '22 23:10

Deniz da King


1 Answers

Pass context through Adapter constructor from Activity (this) or (getActivity()). Seems like viewGroup context is null when reload.

like image 90
Miguel González Avatar answered Nov 15 '22 06:11

Miguel González