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)
이 경우이 문제 어떤는 일반적으로 발생하지 제공했다 . 다음과 같이 할 수 있습니다.LayoutManager
RecyclerView
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));
}
잘못된 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);
저는 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);
'IT' 카테고리의 다른 글
Xcode에서 코드 들여 쓰기 수정 (0) | 2020.09.04 |
---|---|
PHP의 URL에 데이터 POST (0) | 2020.09.04 |
Oracle SQL, 여러 열 연결 + 텍스트 추가 (0) | 2020.09.04 |
java.lang.IllegalStateException : 응답이 커밋 된 후 (forward | sendRedirect | create session) 수 없습니다. (0) | 2020.09.04 |
process.waitFor ()는 절대 반환하지 않습니다. (0) | 2020.09.04 |