IT

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

lottoking 2020. 9. 4. 07:44
반응형

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


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

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

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

제 경우에는 '최종'에 연결되지 않은 경우 @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);

나에게 동일한 문제가 있었는데, 문제는 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);
}

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

}

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

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

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

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

ButterKnife.bind(this);

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

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

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

recyclerView.setLayoutManager(new LinearLayoutManager(context));

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

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

나는 당신의 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;
}

나에게 문제는 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에 추가했을 때 작동했습니다.


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

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

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

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


내가 당신이있는 곳이라면 나는 이것을 할 것입니다. 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);

참고 URL : https://stackoverflow.com/questions/27416834/app-crashing-when-trying-to-use-recyclerview-on-android-5-0

반응형