Android 5.0에서 RecyclerView를 사용하려고 할 때 앱 충돌


91

새로운 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)

Viewpager 탭에 의한이 오류가있는 사람이 볼 솔루션
하산 Gilak

이 문제를 해결 했습니까?. 같은 문제가 발생하도록 도와주세요
Sagar

onCreateView제거 / 파기 / 등록 취소 할 항목 을 설정 / 생성 / 등록 onDestroyView해야합니다. 이러한 수명주기를 따라야합니다!
Sakiboy

답변:


211

어떤이 경우이 문제는 일반적으로 발생하지 LayoutManager제공했다 RecyclerView. 다음과 같이 할 수 있습니다.

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

14
나는 그것이 최종적 일 필요가 없다고 생각하기 때문에 그것이 문제라고 생각하지 않습니다. 제 경우에는 recyclerView로 조각을 구현하고 있었고 onCreateView에서 해당 조각에 대한 참조를 유지하고 나중에 데이터가로드 될 때 layoutManager를 설정하려고했습니다. 이 문제가 있었고 게임의 onCreateView 메서드에서 이전에 layoutManager를 설정했을 때 사라졌습니다.
Nemanja Kovacevic

3
@ NemanjaKovačević 음, 나중에 변경할 필요가없는 모든 변수 final는으로 선언해야한다고 생각 final합니다. 그래서 여기서 선언했습니다 .
aga

2
LinearLayoutManager는 기본적으로 수직이므로 다음을 사용할 수 있습니다. recyclerView.setLayoutManager (new LinearLayoutManager (context));
ll

1
Google에서 이해하기 위해 만든 것과 동일한 오류 메시지를 Google로 검색 할 수 있다는 점에 감사드립니다.
jhegedus

1
@wesleyfranks 1. RecyclerView를 설정하는 코드와 2. 충돌 후 얻고있는 스택 트레이스를 보지 않고 널 객체 참조를 얻는 이유를 말하기는 어렵습니다. :)
aga 19

26

제 경우에는 '최종'에 연결되지 않았지만 @aga 답변에 대한 @ NemanjaKovačević 댓글에 언급 된 문제에 연결되었습니다. 데이터로드시 layoutManager를 설정했는데 이것이 동일한 충돌의 원인이었습니다. 내 조각의 onCreateView로 layoutManager 설정을 이동 한 후 문제가 해결되었습니다.

이 같은:

@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
한 번 더 :이 문제가 어떻게 든 변수가 최종적이지 않은 것과 관련이 있다고 말하지 않습니다. 문제는 LayoutManager 제공되지 않았다는 것입니다. 변수가 LayoutManagerfinal을 가리 키 거나 final이 아니 도록 만들 수 있습니다 . 아무 것도 변경하지 않습니다.
aga

@Yurik 조각이 아닌 활동에서 recyclerview를 사용하고 있습니다. 나를위한 경우는 무엇입니까?
Youri

@Youri 당신은 당신의 활동의 onCreate에 layoutManager 설정을 배치해야한다고 생각합니다.
YuriK

10

나에게 동일한 문제가 있었는데, 문제는 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를 제거했고 아무런 문제없이 작동했습니다. 감사합니다 남자 @Maurice ^^
Bhupinder

1
하루를 낭비 후에 내가 당신의 솔루션을 시도하고 일 : D를 [:( 내 시간을 낭비있어]
mfaisalhyder

8

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

2
그럼에도 불구하고, 내 문제가 해결되지 않은 : 나는 거의 모든 솔루션을 시도하고 :( PagerView에 표시 할 수있는 조각 내부 RecyclerView를 사용할 때 여전히 같은 오류가 /
mfaisalhyder

대박! 작업 RecyclerView으로 초기화 코드 이동onViewCreated(...)
Marcelo Gracietti

이 솔루션을 수행했지만 여전히 나를 위해 null이었습니다. 그래도 여전히 어디 있는지 알아 내려고 노력 중입니다.
wesley franks 19-06-20

5

방법 setLayoutManager에서 사용해야 합니다 RecyclerView#onCreate(). 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));

}

3

잘못된 RecyclerViewID 참조로 인해이 문제가 발생했습니다 .

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

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

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

리사이클 러 뷰 ID를 확인하고 실제 리사이클 러 뷰를 가리키면 문제가 해결되었습니다.


1

내 문제는 내 XML lyout에 android : animateLayoutChanges 가 true로 설정되어 있고 Java 코드의 RecyclerView 어댑터에서 notifyDataSetChanged ()를 호출했습니다.

그래서 방금 내 레이아웃에서 android : animateLayoutChanges 를 제거 했으며 내 문제가 해결되었습니다.


1

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

1

에서 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;
    }

에서 활동 우리가 사용하는 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);

당신이 사용하려는 경우 GridLayoutManager 사용하여 RecyclerView다음과 같이 사용 :

        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

저는 Dependency Injection - ButterKnife를 사용하고 있었는데 뷰를 바인딩 하지 않았기 때문에이 문제가 발생했습니다.

그래서 onCreate () 안에 다음 줄을 삽입했습니다.

ButterKnife.bind(this);

종속성 주입을 사용한 RecyclerView 선언 :

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

1

사용하는 사람들을 위해 : 구현 'androidx.recyclerview : recyclerview : 1.1.0-beta05'

XML 레이아웃에서 이것을 사용하고 있는지 확인하십시오.

API 27 이하에서 내 앱을 실행할 때도 충돌이 발생했습니다. 다음은 메시지에 대한 링크입니다.

원래 recyclerview 내에서 내 textview의 글꼴 크기를 변경하는 스타일을 만들었습니다. 그래서 아래에이 코드를 만들었습니다. (화면 크기에 따라 글꼴 크기를 변경할 때 @dimen을 호출 할 수있었습니다)

style.xml 내부

그리고 이것을 내 테마에 추가했습니다.

themes.xml

조사 후 이것이 오류를 일으키는 원인이라는 것을 알았고 스타일을 제거한 후 더 이상 충돌이 발생하지 않습니다.

나는 여기 스택 오버플로에서 찾은 모든 가능한 해결책을 시도했고 거의 포기했습니다. 고맙게도 호기심으로 스타일을 제거하지 않으면 충돌이 발생하고 충돌이 사라질 수 있다고 생각했습니다.


1
이미지에 연결하는 대신 코드 예제를 직접 포함하세요. : 섹션 "문제 재현 도움말 다른 사람의"한 번 봐 stackoverflow.com/help/how-to-ask
크리스 B

1
나는 정말이 @ChrisB입니다. 보시다시피 저의 평판이 너무 낮기 때문에 여기에 댓글을다는 것은 이번이 처음입니다. 오늘 충돌이 발생했으며 특히 'androidx.recyclerview : recyclerview : 1.1.0-beta05'를 사용하는 사람들이 특히 직면하고 있기 때문에 여기에 게시하려고 생각했습니다.
Jeanne이

0

LinearLayoutManager는 기본적으로 수직이므로이를 수행하는 더 쉬운 방법은 다음과 같습니다.

recyclerView.setLayoutManager(new LinearLayoutManager(context));

방향을 변경하려면 다음 생성자를 사용할 수 있습니다.

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

이상한 issulinearlayout 관리자가 있습니다. 메신저 인스턴스화하지만 여전히이 오류가 있습니다. 이런 젠장.
filthy_wizard

0

나는 당신의 Adapter. 당신이 돌아왔다 확인 ViewHolder에를 onCreateViewHolder(). 아래와 같이 :

@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

나에게 문제는 recycleView에 ID가없는 activity_main.xml (21)이었습니다.

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

android : id = "@ + id / transac_recycler_view"를 activity_main.xml (21) recycleView에 추가했을 때 작동했습니다.


0

제 경우에는 butterknife 라이브러리 만 추가하고 annotationProcessor를 추가하는 것을 잊었습니다. build.gradle (앱 모듈)에 아래 줄을 추가하여 문제를 해결했습니다.

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

0

Recyclerview recylerview = findbyid (R.id.recyclerview) 놓쳤을 수도 있습니다.


안녕하세요, SO에 오신 것을 환영합니다! 이것이이 질문과 관련된 이유를 좀 더 설명해주십시오. 현재 쓰여져 있기 때문에 당신이 말하는 것을 말하기는 어렵습니다.
Piotr Kamoda

0

GenyMotion에서 내 응용 프로그램을 테스트 할 때 비슷한 문제가 발생했습니다. GenyMotion에서 장치를 다시 시작한 후 문제가 해결되었습니다.


0

나는 activity_main.xml이 아닌 다른 레이아웃에 RecyclerView가 있었기 때문에 동일한 문제에 직면했습니다.

일부 사이트를 검색하여 뭔가를 얻었고 여기에서 공유하고 싶었습니다.

  1. Activity_main.xml에 태그를 포함 할 ID 추가

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

  2. MainActivity.java에서 ID로보기를 검색하기 전에이 레이아웃을 호출하십시오.

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

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


-1

내가 당신이있는 곳이라면 나는 이것을 할 것입니다. onView (withId (android.R.id.list)). perform (RecyclerViewActions.scrollToPosition (3)); android.R.id.list를 목록 ID로 변경하면 위치가 배열 내부의 위치가됩니다.


-1

조각 사용

onCreateView ()에서 코드 작성

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

활동 사용

onCreate ()에 코드 작성 RecyclerView recyVideo = findViewById (R.id.recyVideoFag);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.