布局填充异常

5
这是问题,我有一个 RecycleView 适配器,在 onCreateViewHolder 中充气视图。 当我尝试按照以下顺序执行以下操作时会发生这种情况:
  1. 应用程序正常创建
  2. 进入多任务窗口
  3. 回到应用程序
  4. InflateException
错误发生在Fresco的SimpleDraweeView定义在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" />

这是我将适配器设置给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();
}

我尝试在设置适配器到 RecycleView 的 Activity 中重写 onResume 方法(主要原因:从 onCreate 恢复以避免传递空适配器):

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

这是我在适配器中填充布局的方法。如果填充失败,我会尝试重新填充。

@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

我认为ACRA会截断它。我将尝试不使用ACRA。 - Deniz da King
好的,请展示XML并提到第15行有什么。 - OneCricketeer
1
好消息和坏消息都在这里:如果我删除第15行,一切都会按预期运行。坏消息是我需要这个视图。 - Deniz da King
你能否制作一个问题的 [mcve]? - OneCricketeer
你是否正确设置了Fresco?这包括添加Gradle依赖项,初始化Fresco并在启用ProGuard的情况下相应地进行配置。 第15行是什么?<com.facebook.drawee.view.SimpleDraweeView? - Alexander Oprisnik
显示剩余13条评论
1个回答

2
从Activity (this)或者(getActivity())通过Adapter构造函数传递上下文。当重新加载时,viewGroup上下文似乎为null。

你能更具体地说明为什么在重新加载时viewGroup可能为空吗?我在构造函数中设置了上下文。 - Deniz da King
你能粘贴一下使用适配器构造函数的那一行吗? - Miguel González
你说你在上面的onResume方法中将适配器设置为RecyclerView... 在哪里? - Miguel González
是的,抱歉我想说的是我在设置适配器的 Activity 上实现了 onResume。我会编辑我的问题。 - Deniz da King
在这一行代码 recList.setAdapter(new gagAdapter(list, context)); 上设置断点,并检查 context 是否为 null。 - Miguel González
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接