簡體   English   中英

嘗試在 android 5.0 上使用 RecyclerView 時應用程序崩潰

[英]App crashing when trying to use RecyclerView on android 5.0

我試圖弄亂新的 RecyclerView,每當我嘗試運行它時,我的應用程序都會立即崩潰。 它給了我 NullPointerException 以嘗試從android.support.v7.widget.RecyclerView訪問方法。 我查看了其他帖子,發現大多數人都沒有compile 'com.android.support:recyclerview-v7:+'但我試過了,它根本沒有幫助。 不太確定此時該做什么,任何幫助將不勝感激。 這里是錯誤日志:(我會發布一張圖片,但我還沒有 10 代表)

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView$LayoutManager.onMeasure(android.support.v7.widget.RecyclerView$Recycler, android.support.v7.widget.RecyclerView$State, int, int)' on a null object reference
        at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:1764)
        at android.view.View.measure(View.java:17430)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17430)
        at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:851)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560)
        at android.view.View.measure(View.java:17430)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5786)
        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:5221)
        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:898)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)

當沒有為RecyclerView提供LayoutManager時,通常會發生此問題。 你可以這樣做:

final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);

就我而言,它與“最終”無關,而是與@NemanjaKovačević 對@aga 答案的評論中提到的問題有關。 我在數據加載時設置了 layoutManager,這也是導致同樣崩潰的原因。 將 layoutManager 設置移動到我的片段的 onCreateView 后,問題得到解決。

像這樣的東西:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
{
...
mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler);

mLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(mLayoutManager);

對我來說,我遇到了同樣的問題,問題是 xml 中有一個未使用的 RecyclerView 視圖消失了,但我沒有將它綁定到 Activity 中的任何適配器,因此出現了問題。 一旦我在 xml 中刪除了這種未使用的回收器視圖,它就解決了

即 - 我刪除了這個視圖,因為它沒有在代碼中調用,或者已經設置了任何適配器

<android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/rv_profileview_allactivities"
        android:visibility="gone" />

即使我正確設置了RecyclerView.LayoutManager我也遇到了這個崩潰。 我不得不將RecyclerView初始化代碼移動到onViewCreated(...)回調中來解決這個問題。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_listing, container, false);
    rootView.setTag(TAG);
    return inflater.inflate(R.layout.fragment_listing, container, false);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    mLayoutManager = new LinearLayoutManager(getActivity());
    mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

    mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());
    mRecyclerView.setLayoutManager(mLayoutManager);

    mAdapter = new ListingAdapter(mListing);
    mRecyclerView.setAdapter(mAdapter);
}

您需要在RecyclerView#onCreate()方法中使用setLayoutManager 在將recyclerView添加到視圖之前,它必須設置LayoutManager

 private RecyclerView menuAsList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    menuAsList = (RecyclerView) findViewById(R.id.recyclerView_mainMenu);
    menuAsList.setLayoutManager(new LinearLayoutManager(Home.this));

}

由於RecyclerView id 引用錯誤,我遇到了這個問題。

recyclerView = (RecyclerView) findViewById(R.id.rv_followers_list);

recyclerView = (RecyclerView) findViewById(R.id.rv_search_list);
recyclerView =
            (RecyclerView) findViewById(R.id.recycler_view2);

與您的回收商視圖 ID 核對,指向實際的回收商視圖解決了我的問題

我的問題是在我的 XML lyout 我有一個android:animateLayoutChanges設置為 true 並且我在 Java 代碼中的 RecyclerView 的適配器上調用了 notifyDataSetChanged() 。

所以,我剛剛從我的布局中刪除了android:animateLayoutChanges ,這解決了我的問題。

我在使用 Butterknife 庫時遇到了這個問題。 我有:

View rootView = inflater.inflate
                (R.layout.fragment_recipe_detail_view, container, false);
ButterKnife.bind(rootView);

但正確的版本是:

View rootView = inflater.inflate
                (R.layout.fragment_recipe_detail_view, container, false);
ButterKnife.bind(this, rootView);

Gradle 中實現這個庫:

implementation 'com.android.support:appcompat-v7:SDK_VER'
implementation 'com.android.support:design:SDK_VER'
implementation 'com.android.support:support-v4:SDK_VER'
implementation 'com.android.support:support-v13:SDK_VER'
implementation 'com.android.support:recyclerview-v7:SDK_VER'

XML 中這樣提及:

<android.support.v7.widget.RecyclerView
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:id="@+id/recyclerView"/>

Fragment 中,我們像這樣使用recyclerView

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
       View rootView = inflater.inflate(R.layout.YOUR_LAYOUT_NAME, container, false);

       RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(layoutManager);
        APICallMethod();
        YOURADAPTER = new YOURADAPTER(getActivity(), YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
        recyclerView.setAdapter(YOURADAPTER);
        return rootView;
    }

Activity 中,我們像這樣使用RecyclerView

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.YOUR_LAYOUT_NAME);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(layoutManager);
        APICallMethod();
        YOURADAPTER = new YOURADAPTER(ACTIVITY_NAME.this, YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
        recyclerView.setAdapter(YOURADAPTER);
   }

如果您需要水平RecyclerView請執行以下操作:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(layoutManager);
        APICallMethod();
        YOURADAPTER = new YOURADAPTER(ACTIVITY_NAME.this, YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
        recyclerView.setAdapter(YOURADAPTER);

如果您想使用RecyclerView使用GridLayoutManager,請使用如下所示:

        RecyclerView recyclerView = findViewById(R.id.rvNumbers);
        recyclerView.setLayoutManager(new GridLayoutManager(this, 3)); // 3 is number of columns.
        adapter = new MyRecyclerViewAdapter(this, data);
        recyclerView.setAdapter(adapter);

我正在使用依賴注入- ButterKnife 出現這個問題是因為我沒有綁定視圖。

所以在 onCreate() 我剛剛插入了這一行:

ButterKnife.bind(this);

我的 RecyclerView 聲明與依賴注入:

@BindView(R.id.recyclerview)
RecyclerView recyclerView;

對於那些使用:實現 'androidx.recyclerview:recyclerview:1.1.0-beta05'

確保您在 xml 布局中使用它

在 API 27以下運行我的應用程序時,我也遇到了崩潰。這是消息的鏈接

最初,我創建了一個樣式來更改 recyclerview 中 textview 的字體大小,這就是我在下面創建此代碼的原因:(我可以在根據屏幕大小更改字體大小時調用 @dimen)

里面的style.xml

並在我的主題中添加了這個

主題文件

經過調查,我發現這是導致我出錯的原因,刪除樣式后,我不再遇到崩潰。

我嘗試了在堆棧溢出中找到的所有可能的解決方案,但幾乎放棄了這一點,幸好出於好奇,我想為什么不刪除樣式可能會導致崩潰,然后崩潰就消失了。

由於默認情況下 LinearLayoutManager 是垂直的,因此更簡單的方法是:

recyclerView.setLayoutManager(new LinearLayoutManager(context));

如果你想改變方向,你可以使用這個構造函數:

public LinearLayoutManager(Context context, int orientation, boolean reverseLayout);

我認為問題出在您的Adapter 確保您已在onCreateViewHolder()返回ViewHolder 像下面這樣:

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v;
    v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_leaderboard, parent, false);
    ViewHolder view_holder = new ViewHolder(v);
    return view_holder;
}

對我來說,問題出在我的 activity_main.xml(21) 中,其中 recycleView 沒有 id。

活動_main.xml(21)

 <android.support.v7.widget.RecyclerView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginRight="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/button3"
    tools:listitem="@layout/transaction_list_row" />

活動_main.xml

<android.support.v7.widget.RecyclerView

    android:id="@+id/transac_recycler_view"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginLeft="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginRight="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/button3"
    />

當我向 activity_main.xml(21) recycleView 添加一個 android:id="@+id/transac_recycler_view" 時它起作用了

就我而言,我只添加了黃油刀庫而忘記添加 annotationProcessor。 通過將以下行添加到 build.gradle(App 模塊),解決了我的問題。

    annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'

Recyclerview recylerview = findbyid(R.id.recyclerview) 可能你錯過了

我在 GenyMotion 上測試我的應用程序時遇到了類似的問題。 在 GenyMotion 中重啟設備后問題解決了

我遇到了同樣的問題,因為我在另一個布局中而不是在 activity_main.xml 中有 RecyclerView。

通過在一些網站上搜索,我得到了一些東西,並想在這里分享

  1. 在 Activity_main.xml 中添加 Id 以包含標簽

    <include id="includedRecyclerLayout" .... </include>

  2. 在 MainActivity.java 中按 ID 搜索視圖之前調用此布局

    `ConstraintLayout includesLayout = findViewById(R.id.inckudedRecyclerLayout);

    RecyclerViewrecyclerview=includedLayout.findViewById(R.id.RECYCLER_VIEW_ID)`;

我在使用 Butterknife 時遇到了這個問題,我使用的是 fragment

對於 Fragment,應該是ButterKnife.bind(this,view);

對於活動ButterKnife.bind(this);

如果我在哪里你我會這樣做。 onView(withId(android.R.id.list)).perform(RecyclerViewActions.scrollToPosition(3)); android.R.id.list 將其更改為您的列表 ID,位置將是您在數組中的位置。

使用片段

在 onCreateView() 中編寫代碼

RecyclerView recyVideo = view.findViewById(R.id.recyVideoFag);

使用活動

在 onCreate() RecyclerView recyVideo = findViewById(R.id.recyVideoFag) 中編寫代碼;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM