Ứng dụng gặp sự cố khi cố gắng sử dụng RecyclerView trên Android 5.0


91

Tôi đang cố gắng làm rối với RecyclerView mới và bất cứ khi nào tôi cố chạy nó, ứng dụng của tôi ngay lập tức bị treo. Nó cung cấp cho tôi NullPointerException để cố gắng truy cập các phương thức từ android.support.v7.widget.RecyclerView. Tôi đã xem các bài đăng khác và thấy rằng hầu hết mọi người không có compile 'com.android.support:recyclerview-v7:+'nhưng tôi đã thử điều đó và nó không giúp ích gì cả. Bạn không thực sự chắc chắn phải làm gì vào lúc này, mọi sự trợ giúp sẽ được đánh giá cao. Đây là nhật ký lỗi: (Tôi sẽ đăng một bức ảnh nhưng tôi chưa có 10 đại diện)

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)

cho bất cứ ai có lỗi này gây ra bởi các tab ViewPager thấy điều này giải pháp
Hassan Gilak

Có bạn giải quyết điều này giúp đỡ Xin vui lòng Tôi gặp cùng một vấn đề?
Sagar

Hãy nhớ thiết lập / tạo / đăng ký trong onCreateViewnhững gì bạn xóa / hủy / hủy đăng ký trong onDestroyView... Gotta tuân theo những vòng đời đó!
Sakiboy

Câu trả lời:


211

Vấn đề này thường xảy ra khi không LayoutManagerđược cung cấp cho RecyclerView. Bạn có thể làm như vậy:

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

14
Tôi không nghĩ nó cần phải kết thúc nên tôi không nghĩ đó là vấn đề. Trong trường hợp của tôi, tôi đang triển khai một phân đoạn với recallerView và tôi đã cố gắng giữ lại một tham chiếu đến nó từ onCreateView và đặt layoutManager sau khi dữ liệu được tải. Tôi đã gặp sự cố này và nó đã biến mất khi tôi đặt layoutManager trước đó trong phương thức gamein onCreateView.
Nemanja Kovacevic,

3
@ NemanjaKovačević tốt, tôi cho rằng mọi biến không cần thay đổi sau này phải được khai báo là final, đó là lý do tại sao tôi đã khai báo finalở đây.
aga

2
Vì LinearLayoutManager là theo chiều dọc theo mặc định, bạn có thể sử dụng: renderView.setLayoutManager (new LinearLayoutManager (context));
sẽ

1
Cảm ơn Chúa vì chúng tôi có thể Google xử lý các thông báo lỗi tương tự do Google tạo ra để giải quyết chúng.
jhegedus

1
@wesleyfranks thật khó để biết tại sao bạn nhận được tham chiếu đối tượng null mà không nhìn vào 1. mã thiết lập RecyclerView và 2. ngăn xếp bạn nhận được sau sự cố. :)
aga

26

Trong trường hợp của tôi, nó không được kết nối với 'cuối cùng', nhưng với vấn đề được đề cập trong @ NemanjaKovačević bình luận cho câu trả lời @aga. Tôi đang đặt layoutManager khi tải dữ liệu và đó là nguyên nhân gây ra sự cố tương tự. Sau khi chuyển thiết lập layoutManager sang onCreateView trong phân đoạn của tôi, sự cố đã được khắc phục.

Một cái gì đó như thế này:

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

1
Một lần nữa: Tôi không nói rằng vấn đề này bằng cách nào đó có liên quan đến biến không phải là cuối cùng. Vấn đề là nó LayoutManager không được cung cấp , đó là nó. Bạn có thể làm cho biến trỏ đến LayoutManagercuối cùng hoặc không cuối cùng - nó không thay đổi bất cứ điều gì.
aga

@Yurik, tôi đang sử dụng Recyclerview trong Activity không phải trên mảnh. những gì trường hợp cho tôi?
Youri

@Youri bạn chỉ nên đặt thiết lập layoutManager vào onCreate của hoạt động của bạn, tôi nghĩ.
YuriK

10

Đối với tôi, tôi đang gặp vấn đề tương tự, vấn đề là có một RecyclerView không sử dụng trong xml với chế độ xem đã biến mất nhưng tôi không liên kết nó với bất kỳ bộ điều hợp nào trong Activity, do đó vấn đề. Nó đã được giải quyết ngay sau khi tôi xóa các chế độ xem tái chế không sử dụng như vậy trong xml

tức là - Tôi đã xóa chế độ xem này vì chế độ xem này không được gọi trong mã hoặc bất kỳ bộ điều hợp nào đã được đặt

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

Tương tự ở đây, mọi thứ đều hoàn hảo, nhưng nó không hoạt động. Vì vậy, tôi đã xóa các chế độ xem lại không sử dụng và nó hoạt động mà không gặp vấn đề gì. Cảm ơn người đàn ông @Maurice ^^
Bhupinder

1
sau khi lãng phí một ngày tôi đã cố gắng giải pháp của bạn và nó làm việc: D [:( thời gian của tôi đã lãng phí]
mfaisalhyder

8

Tôi đã trải qua sự cố này mặc dù tôi đã RecyclerView.LayoutManagerthiết lập đúng cách. Tôi đã phải di chuyển RecyclerView mã khởi tạo vào lệnh onViewCreated(...)gọi lại để khắc phục sự cố này.

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

2
Tuy nhiên, vấn đề của tôi không được giải quyết: / tôi đã cố gắng hầu hết các giải pháp và vẫn nhận được lỗi tương tự khi sử dụng RecyclerView bên trong một đoạn được thể hiện trong PagerView :(
mfaisalhyder

Tuyệt vời! Di chuyển RecyclerViewmã khởi tạo vào onViewCreated(...) hoạt động
Marcelo Gracietti,

Tôi đã thực hiện giải pháp này, và nó vẫn vô hiệu đối với tôi. Vẫn đang cố gắng tìm ra nơi mặc dù.
wesley franks

5

Bạn cần sử dụng setLayoutManagertrong RecyclerView#onCreate()phương pháp. Trước khi thêm recyclerViewvào một dạng xem, nó phải có LayoutManagerbộ.

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

}

3

Tôi gặp sự cố này do tham chiếu sai RecyclerViewid.

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

đến

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

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

Kiểm tra với bạn ID chế độ xem người tái chế, trỏ đến chế độ xem người tái chế thực tế đã giải quyết được vấn đề của tôi


1

Sự cố của tôi là trong tệp tin XML của tôi, tôi có một android: animateLayoutChanges được đặt thành true và tôi đã gọi thông báo làtifyDataSetChanged () trên bộ điều hợp của RecyclerView trong mã Java.

Vì vậy, tôi vừa xóa android: animateLayoutChanges khỏi bố cục của mình và điều đó đã giải quyết vấn đề của tôi.


1

Tôi gặp sự cố này khi sử dụng thư viện Butterknife. Tôi đã có:

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

Nhưng phiên bản chính xác là:

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

1

Trong Gradle triển khai thư viện này:

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'

Trong XML đề cập như thế này:

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

Trong Fragment, chúng tôi sử dụng recyclerViewnhư thế này:

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

Trong Activity, chúng tôi sử dụng RecyclerViewnhư thế này:

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

nếu bạn cần ngang, RecyclerView hãy làm như sau:

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

nếu bạn muốn sử dụng GridLayoutManager bằng cách RecyclerViewsử dụng như sau:

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

1

Tôi đang sử dụng Máy tiêm phụ thuộc - ButterKnife và vấn đề này đã phát sinh do tôi không liên kết chế độ xem.

Vì vậy, bên trong onCreate (), tôi chỉ chèn dòng này:

ButterKnife.bind(this);

Khai báo RecyclerView của tôi với Dependency Injection:

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

1

Đối với những người đang sử dụng: implement 'androidx.recyclerview: Recyclerview: 1.1.0-beta05'

đảm bảo rằng bạn đang sử dụng cái này trong bố cục xml của mình

Tôi cũng gặp phải sự cố khi chạy ứng dụng của mình bên dưới API 27. Đây là liên kết đến thông báo

Ban đầu, tôi đã tạo một kiểu để thay đổi kích thước phông chữ của chế độ xem văn bản của mình bên trong chế độ xem tái chế, đó là lý do tại sao tôi tạo mã này bên dưới: (Tôi có thể đã gọi @dimen khi thay đổi kích thước phông chữ dựa trên kích thước màn hình)

Inside style.xml

và thêm điều này vào chủ đề của tôi

themes.xml

Sau khi điều tra, tôi phát hiện ra rằng đây là một trong những nguyên nhân gây ra lỗi cho tôi và sau khi loại bỏ phong cách, tôi không còn gặp sự cố nữa.

Tôi đã thử tất cả các giải pháp có thể mà tôi tìm thấy ở đây trong vấn đề tràn ngăn xếp và gần như từ bỏ điều này, may mắn thay, tôi tò mò đã nghĩ tại sao không loại bỏ kiểu có thể điều này gây ra sự cố và sau đó sự cố bùng nổ biến mất.


1
Vui lòng bao gồm các ví dụ mã trực tiếp thay vì liên kết đến hình ảnh. Hãy xem phần "Giúp người khác tái tạo sự cố": stackoverflow.com/help/how-to-ask
Chris B

1
Tôi thực sự dành cho @ChrisB này. Đây là lần đầu tiên tôi đưa ra bình luận ở đây vì danh tiếng của tôi quá thấp như bạn có thể thấy. Tôi đã gặp phải sự cố hôm nay và tôi đã suy nghĩ để đăng ở đây vì có thể có những người cũng đang phải đối mặt với điều này, đặc biệt là họ đang sử dụng 'androidx.recyclerview: tái chế: 1.1.0-beta05'.
Jeanne vie

0

Vì LinearLayoutManager là dọc theo mặc định, một cách dễ dàng hơn để làm điều này là:

recyclerView.setLayoutManager(new LinearLayoutManager(context));

Nếu bạn muốn thay đổi hướng, bạn có thể sử dụng hàm tạo này:

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

hiện đang có một trình quản lý Issulinearlayout lạ. Tôi tạo nó nhưng vẫn còn lỗi này. bò thánh.
filthy_wizard

0

Tôi nghĩ rằng vấn đề ở bạn Adapter. Hãy chắc chắn rằng bạn đã trở lại ViewHoldertrong onCreateViewHolder(). Như bên dưới:

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

0

Đối với tôi, vấn đề là với activity_main.xml (21) của tôi, trong đó recycleView không có id.

activity_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" />

activity_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"
    />

Nó hoạt động khi tôi thêm android: id = "@ + id / transac_recycler_view" vào activity_main.xml (21) recycleView


0

Trong trường hợp của tôi, tôi chỉ thêm thư viện butterknife và quên thêm annotationProcessor. Bằng cách thêm dòng bên dưới vào build.gradle (Mô-đun ứng dụng), đã giải quyết được vấn đề của tôi.

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

0

Recyclerview recylerview = findbyid (R.id.recyclerview) Có thể bạn đã bỏ lỡ nó


Xin chào, chào mừng đến với SO! Vui lòng giải thích thêm một số lý do tại sao điều này có liên quan cho câu hỏi này. Vì nó hiện đang được viết nên thật khó để nói những gì bạn đang tham khảo.
Piotr Kamoda

0

Tôi đã gặp sự cố tương tự khi kiểm tra ứng dụng của mình trên GenyMotion. Sau khi khởi động lại thiết bị trong GenyMotion sự cố đã được giải quyết


0

Tôi gặp phải vấn đề tương tự vì tôi có RecyclerView trong một bố cục khác chứ không phải trên activity_main.xml.

Bằng cách tìm kiếm trên một số trang web, tôi đã nhận được thứ gì đó và cảm thấy muốn chia sẻ ở đây

  1. Thêm Id để Bao gồm thẻ trong Activity_main.xml

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

  2. gọi bố cục này trước khi xem Tìm kiếm theo ID trong MainActivity.java

    `ConstraintLayout includeLayout = findViewById (R.id.inckishedRecyclerLayout);

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


-1

Nếu tôi ở nơi bạn tôi sẽ làm điều này. onView (withId (android.R.id.list)). thực hiện (RecyclerViewActions.scrollToPosition (3)); android.R.id.list thay đổi nó thành id danh sách của bạn và vị trí sẽ là vị trí của bạn trong mảng của bạn.


-1

sử dụng phân mảnh

viết mã trong onCreateView ()

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

sử dụng hoạt động

viết mã trong onCreate () RecyclerView recyVideo = findViewById (R.id.recyVideoFag);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.