재활용기 뷰 부착된 어댑터 없음, 레이아웃 건너뛰기
구현한 방금구RecyclerView
에서, 내코에서, 체대를 하는.ListView
.
모든 것이 잘 작동합니다.데이터가 표시됩니다.
그러나 오류 메시지가 기록되고 있습니다.
15:25:53.476 E/RecyclerView: No adapter attached; skipping layout
15:25:53.655 E/RecyclerView: No adapter attached; skipping layout
다음 코드의 경우:
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
보시다시피, 저는 다음 용도의 어댑터를 부착했습니다.RecyclerView
그런데 왜 이런 오류가 계속 나오는 거지?
저는 같은 문제와 관련된 다른 질문들을 읽었지만 아무도 도움이 되지 않습니다.
된 비동기 의 "메인" 문을 할 수 예: " the "inse the " 지 예 " 메 " 인 " 내 " 을 " 호 " 는 " 지 " 있 " 니 " 습 " 수 " 까 " 할 " 인 " 연 확 " 하 " 된 " 출 " 부 " 비 " 동 " 기 " 문 " 한 " 콜 " 백 " 에 " 의 " 서 " 드 " 러 " 이 " 스 " 레 " 외 " 부onCreate()
방법)을 선택합니다.내가 "지연된" 방법에서 같은 진술을 호출하는 즉시.에는 의 경 우 나 경 ▁a 우 ▁in 나 의 ▁myResultCallback
저도 같은 메시지를 받습니다.
내 안에서Fragment
에서 아호기출하코드를래 안에서 ResultCallback
메소드는 동일한 메시지를 생성합니다.를 드를다로이후동한으로 한 후onConnected()
내 앱에 있는 메소드, 메시지가 사라졌습니다...
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );
코드에서 두 가지를 수정할 때까지 동일한 두 개의 오류 메시지가 표시되었습니다.
적으로 할 때RecyclerView.Adapter
다음을 생성합니다.
@Override
public int getItemCount() {
return 0;
}
코드가 다음과 같이 표시되도록 코드를 업데이트해야 합니다.
@Override
public int getItemCount() {
return artists.size();
}
항목에 항목이 0개 있으면 화면에 항목이 0개 표시됩니다.
CardView layout_width="match_parent"가 상위 RecyclerView 너비와 일치하지 않습니다.
//correct
LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_listitem, parent, false);
//incorrect (what I had)
LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_listitem,null);
BONUS: 의 편집: 또한다: ▁▁your합다▁you를 설정해야 .RecyclerView
다음과 같이:
<android.support.v7.widget.RecyclerView
android:id="@+id/RecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
이런 식이 아닙니다.
<view
android:id="@+id/RecyclerView"
class="android.support.v7.widget.RecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
저는 후자의 방법을 사용한 몇 가지 튜토리얼을 보았습니다.작동하는 동안에도 이 오류가 발생한다고 생각합니다.
저도 당신과 같은 상황이고, 디스플레이는 괜찮지만, 위치에 오류가 나타납니다.그게 제 솔루션입니다. (1) RecyclerView 초기화 및 어댑터 ON CREATE() 바인딩
RecyclerView mRecycler = (RecyclerView) this.findViewById(R.id.yourid);
mRecycler.setAdapter(adapter);
데이터를 받으면 notifyDataStateChanged 호출
adapter.notifyDataStateChanged();
RecyclerView의 소스 코드에는 데이터 상태를 확인할 수 있는 다른 스레드가 있습니다.
public RecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.mObserver = new RecyclerView.RecyclerViewDataObserver(null);
this.mRecycler = new RecyclerView.Recycler();
this.mUpdateChildViewsRunnable = new Runnable() {
public void run() {
if(RecyclerView.this.mFirstLayoutComplete) {
if(RecyclerView.this.mDataSetHasChangedAfterLayout) {
TraceCompat.beginSection("RV FullInvalidate");
RecyclerView.this.dispatchLayout();
TraceCompat.endSection();
} else if(RecyclerView.this.mAdapterHelper.hasPendingUpdates()) {
TraceCompat.beginSection("RV PartialInvalidate");
RecyclerView.this.eatRequestLayout();
RecyclerView.this.mAdapterHelper.preProcess();
if(!RecyclerView.this.mLayoutRequestEaten) {
RecyclerView.this.rebindUpdatedViewHolders();
}
RecyclerView.this.resumeRequestLayout(true);
TraceCompat.endSection();
}
}
}
};
디스패치 레이아웃()에서 다음과 같은 오류가 있음을 확인할 수 있습니다.
void dispatchLayout() {
if(this.mAdapter == null) {
Log.e("RecyclerView", "No adapter attached; skipping layout");
} else if(this.mLayout == null) {
Log.e("RecyclerView", "No layout manager attached; skipping layout");
} else {
이 문제가 있습니다. 몇 번의 문제는 재활용입니다. ScrollView 개체에 보기를 넣었습니다.
구현을 확인한 결과, 그 이유는 다음과 같습니다.RecyclerView가 ScrollView로 전환되면 측정 단계에서 높이가 지정되지 않으며(ScrollView에서 모든 높이를 허용하기 때문에) 결과적으로 최소 높이(구현에 따라) 0이 됩니다.
이 문제를 해결하기 위한 몇 가지 옵션이 있습니다.
- 특정 높이를 RecyclerView로 설정합니다.
- ScrollView를 설정합니다.fillViewport to true
- 또는 RecyclerView를 ScrollView 밖으로 유지합니다.제 생각에는 이것이 단연코 최선의 선택입니다.RecyclerView 높이가 제한되지 않은 경우(ScrollView에 배치된 경우) 모든 어댑터의 보기는 수직으로 충분한 위치를 가지며 한 번에 생성됩니다.더 이상 리사이클러 뷰의 목적을 깨는 뷰 리사이클러 뷰는 존재하지 않습니다.
(다음 기간 동안 수행할 수 있음android.support.v4.widget.NestedScrollView
// SampleHolder.java
public class SampleHolder extends RecyclerView.ViewHolder {
public SampleHolder(View itemView) {
super(itemView);
}
}
다시 아무 것도 하지 않는 RecyclerView를 만듭니다 :)
// SampleRecycler.java
public class SampleRecycler extends RecyclerView.Adapter<SampleHolder> {
@Override
public SampleHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(SampleHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
}
이제 실제 재활용 업체가 준비되지 않았다면 아래와 같은 샘플을 사용하십시오.
RecyclerView myRecycler = (RecyclerView) findViewById(R.id.recycler_id);
myRecycler.setLayoutManager(new LinearLayoutManager(this));
myRecycler.setAdapter(new SampleRecycler());
이것은 최선의 해결책은 아니지만 효과가 있습니다!이것이 도움이 되기를 바랍니다.
이 문제는 생성 단계 중에 어댑터를 설정하지 않을 때 발생합니다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
....
}
public void onResume() {
super.onResume();
mRecyclerView.setAdapter(mAdapter);
....
}
어댑터 설정을 on으로 이동하기만 하면 됩니다. 빈 데이터로 생성하고 데이터 호출이 있을 때:
mAdapter.notifyDataSetChanged();
어댑터에서 이 메서드를 호출하지 않았는지 확인합니다.
@Override
public int getItemCount() {
return list.size();
}
코틀린에서 우리는 이상한 비논리적인 문제를 가지고 있었습니다.
이것은 작동하지 않았습니다.
mBinding.serviceProviderCertificates.apply {
adapter = adapter
layoutManager = LinearLayoutManager(activity)
}
이것이 효과가 있는 동안:
mBinding.serviceProviderCertificates.adapter = adapter
mBinding.serviceProviderCertificates.layoutManager = LinearLayoutManager(activity)
퇴근 후에 더 많은 정보를 얻으면 더 많은 통찰력을 공유하겠습니다.
RecyclerView의 레이아웃 관리자는 다음과 같이 설정해야 합니다.
mRecyclerView.setLayoutManager(new LinearLayoutManager(context));
에 에.LinearLayoutManager
다른 레이아웃 관리자도 사용할 수 있습니다.
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
위의 코드를 이것으로 바꾸기만 하면 작동할 것입니다.레이아웃 관리자를 호출하기 전에 setAdapter(어댑터)를 호출한 것이 잘못입니다.
만약 당신이 나와 같은 데이터를 레트로핏 같은 것을 사용하여 기다리고 있다면 나는 이것을 하면서 그것을 고친 것과 같은 오류가 있었습니다.
작성하기 전에 붙여넣기
private ArtistArrayAdapter adapter;
private RecyclerView recyclerView;
Oncreate에 저장합니다.
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new ArtistArrayAdapter( artists , R.layout.list_item ,getApplicationContext());
recyclerView.setAdapter(adapter);
데이터 입력을 수신할 때
adapter = new ArtistArrayAdapter( artists , R.layout.list_item ,getApplicationContext());
recyclerView.setAdapter(adapter);
이제 ArtistArrayAdapter 클래스로 이동하여 어레이가 비어 있거나 null인 경우 GetItemCount가 반환됩니다. 그렇지 않으면 아티스트 어레이의 크기가 0이 됩니다.
@Override
public int getItemCount() {
int a ;
if(artists != null && !artists.isEmpty()) {
a = artists.size();
}
else {
a = 0;
}
return a;
}
사자를위를 .RecyclerView
조각 내에서 다른 보기에서 부풀리기: 전체 조각 보기를 부풀릴 때는 바인딩해야 합니다.RecyclerView
근본적으로.
나는 어댑터를 연결하고 모든 것을 올바르게 수행하고 있었지만 바인딩을 수행하지 않았습니다.@Prateek Agarwal의 이 대답은 저를 위한 모든 것을 가지고 있지만, 여기 더 정교한 것이 있습니다.
코틀린
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val rootView = inflater?.inflate(R.layout.fragment_layout, container, false)
recyclerView = rootView?.findViewById(R.id.recycler_view_id)
// rest of my stuff
recyclerView?.setHasFixedSize(true)
recyclerView?.layoutManager = viewManager
recyclerView?.adapter = viewAdapter
// return the root view
return rootView
}
자바
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView= inflater.inflate(R.layout.fragment_layout,container,false);
recyclerview= rootView.findViewById(R.id.recycler_view_id);
return rootView;
}
이 라인은 다음 위치에 있어야 합니다.OnCreate
:
mmAdapter = new Adapter(msgList);
mrecyclerView.setAdapter(mmAdapter);
이 문제는 실제 부풀려진 레이아웃이 재활용품 보기를 찾는 동안 사용자가 참조하는 레이아웃과 다르기 때문에 발생합니다.때 다음과 .return inflater.inflate(R.layout.<related layout>,container.false);
하는 데 합니다.View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view;
레이아웃 xml 파일에서 layoutManager가 있는 맨 아래 줄이 누락되었습니다.제가 오류를 추가한 후 오류가 사라졌습니다.
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view_chat"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:layoutManager="LinearLayoutManager"/>
먼저 어댑터 초기화
public void initializeComments(){
comments = new ArrayList<>();
comments_myRecyclerView = (RecyclerView) findViewById(R.id.comments_recycler);
comments_mLayoutManager = new LinearLayoutManager(myContext);
comments_myRecyclerView.setLayoutManager(comments_mLayoutManager);
updateComments();
getCommentsData();
}
public void updateComments(){
comments_mAdapter = new CommentsAdapter(comments, myContext);
comments_myRecyclerView.setAdapter(comments_mAdapter);
}
데이터 집합이 변경될 때마다 updateComments 메서드를 호출합니다.
저는 이 오류가 있었고, 해결책을 찾을 때까지 잠시 수정하려고 노력했습니다.
저는 개인적인 메서드인 BuildRecyclerView를 만들었고, 처음에는 CreateView에서, 그 다음에는 콜백(API에서 데이터를 가져오는)에서 두 번 호출했습니다.다음은 내 단편에 있는 내 메서드 buildRecyclerView입니다.
private void buildRecyclerView(View v) {
mRecyclerView = v.findViewById(R.id.recycler_view_loan);
mLayoutManager = new LinearLayoutManager(getActivity());
((LinearLayoutManager) mLayoutManager).setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new LoanAdapter(mExampleList);
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
}
또한 On-Create-View 목록이 null이고 오류가 발생하기 때문에 어댑터에서 get-Item-Count 메서드를 수정해야 합니다.get-Item-Count는 다음과 같습니다.
@Override
public int getItemCount() {
try {
return mLoanList.size();
} catch (Exception ex){return 0;}
}
이것은 정말로 당신이 받고 있는 간단한 오류입니다. 이것에 코드를 추가할 필요가 없습니다.이 오류는 활동에서 사용한 레이아웃 파일이 잘못되어 발생합니다. IDE를 통해 자동으로 활동의 기본 레이아웃이 되는 레이아웃 v21을 만들었습니다.이전 레이아웃 파일과 새 레이아웃 파일에서 수행한 모든 코드는 xml 코드가 거의 없어서 오류가 발생했습니다.
솔루션:이전 레이아웃의 모든 코드를 복사하여 레이아웃 v21에 붙여넣기
제 경우에는 어댑터를 안에 설치하고 있었습니다.onLocationChanged()
에뮬레이터의 콜백 및 디버깅.위치 변경을 감지하지 못했기 때문에 발사되지 않았습니다.에뮬레이터의 확장 컨트롤에서 수동으로 설정하면 예상대로 작동했습니다.
저는 이 오류를 해결했습니다.레이아웃 관리자를 추가하고 빈 어댑터를 추가하기만 하면 됩니다.
다음 코드와 같은 것:
myRecyclerView.setLayoutManager(...//your layout manager);
myRecyclerView.setAdapter(new RecyclerView.Adapter() {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
});
//other code's
// and for change you can use if(mrecyclerview.getadapter != speacialadapter){
//replice your adapter
//}
에 다음을 .RecyclerView
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
예:
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
app:layout_constraintBottom_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</android.support.v7.widget.RecyclerView>
ViewBinding을 사용하는 동안 오류가 계속 발생하는 경우 바인딩을 사용하여 부풀린 보기를 반환해야 합니다.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return fragmentBinding.getRoot();
}
저의 경우, 저는 단지 재활용 업체 뷰에 배치 관리자를 추가하고 수리를 받았습니다. 파일을 추가하면 .app:layoutManager
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerViewData"
.
.
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
.
./>
내 상황에서는 View에 위치한 잊혀진 구성 요소였습니다.홀더 클래스이지만 레이아웃 파일에 없습니다.
저도 같은 문제가 있었고, onCreate 메서드에서 LayoutManager와 어댑터를 설정하는 대신 소스에서 데이터를 검색한 후 LayoutManager와 어댑터를 모두 설정하고 있다는 것을 깨달았습니다.
salesAdapter = new SalesAdapter(this,ordersList);
salesView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
salesView.setAdapter(salesAdapter);
그런 다음 데이터 변경 사항을 어댑터에 알립니다.
//get the Orders
Orders orders;
JSONArray ordersArray = jObj.getJSONArray("orders");
for (int i = 0; i < ordersArray.length() ; i++) {
JSONObject orderItem = ordersArray.getJSONObject(i);
//populate the Order model
orders = new Orders(
orderItem.getString("order_id"),
orderItem.getString("customer"),
orderItem.getString("date_added"),
orderItem.getString("total"));
ordersList.add(i,orders);
salesAdapter.notifyDataSetChanged();
}
이 문제는 추가하지 않기 때문입니다.LayoutManager
당신을 위하여RecyclerView
.
다른 이유는 사용자가 이 코드를 비 UI 스레드에서 호출하고 있기 때문입니다.UI 스레드에서 이 통화를 호출해야 합니다.
솔루션은 다음을 추가하기만 하면 됩니다.LayoutManager
를 위해RecyclerView
눈앞에setAdapter
사용자 인터페이스 스레드에서.
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
초기화된 빈 목록과 어댑터를 맨 아래에 설정하고 결과를 가져올 때 notifyDataSetChanged를 호출하면 해결됩니다.
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
recyclerviewItems.setLayoutManager(linearLayoutManager);
someAdapter = new SomeAdapter(getContext(),feedList);
recyclerviewItems.setAdapter(someAdapter);
저는 이 문제로 제 인생의 16분을 잃었습니다. 그래서 저는 제가 저지르고 있던 이 엄청나게 당혹스러운 실수를 인정하겠습니다. 저는 버터나이프를 사용하고 있고 이 단편에서 CreateView의 관점을 묶습니다.
레이아웃 관리자가 없는 이유를 파악하는 데 오랜 시간이 걸렸습니다. 하지만 분명히 뷰가 주입되어 실제로는 null이 되지 않으므로 재활용자는 null이 되지 않습니다.이런!
@BindView(R.id.recycler_view)
RecyclerView recyclerView;
@Override
public View onCreateView(......) {
View v = ...;
ButterKnife.bind(this, v);
setUpRecycler()
}
public void setUpRecycler(Data data)
if (recyclerView == null) {
/*very silly because this will never happen*/
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
//more setup
//...
}
recyclerView.setAdapter(new XAdapter(data));
}
이와 같은 문제가 발생하는 경우 보기를 추적하여 다음과 같은 것을 사용합니다.uiautomatorviewer
저의 경우 선형 레이아웃에 RecyclerView를 포함했기 때문에 발생했습니다.
이전에는 다음과 같이 하나의 루트 RecyclerView만 포함된 레이아웃 파일이 있었습니다.
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:listitem="@layout/fragment_products"
android:name="Products.ProductsFragment"
app:layoutManager="LinearLayoutManager"
tools:context=".Products.ProductsFragment"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"/>
저는 그 문제가 3선 이내에 있다고 생각합니다.어쨌든, 저는 그것이 간단한 문제라고 생각합니다. 내일 그것을 작업할 것입니다. 이 스레드에 대해 잊기 전에 제가 발견한 것을 써야겠다고 생각했습니다.
오류를 검색하는 이 스레드를 발견한 이후로 다른 답변을 추가합니다.초기화를 시도하고 있었습니다.PreferenceFragmentCompat
그러나 나는 선호하는 XML을 부풀리는 것을 잊었습니다.onCreatePreferences
다음과 같이:
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val inflater = LayoutInflater.from(context)
inflater.inflate(R.layout.fragment_settings, null)
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
// Missing this line here:
// setPreferencesFromResource(R.xml.settings, rootKey)
}
}
그 오류는 제가 깨닫기 전까지는 미스터리였습니다.PreferenceFragmentCompat
을 사용해야 합니다.RecyclerView
언급URL : https://stackoverflow.com/questions/29141729/recyclerview-no-adapter-attached-skipping-layout
'programing' 카테고리의 다른 글
iframe 내부의 div 스타일에 영향을 주기 위해 CSS 사용 (0) | 2023.08.09 |
---|---|
Android Studio 수동으로 Gradle Sync를 실행하는 방법은 무엇입니까? (0) | 2023.08.09 |
Oracle 분산 데이터베이스에서 LOB를 처리하는 가장 좋은 방법 (0) | 2023.08.09 |
잘못된 SQL을 반환하는 Larvel 마이그레이션 (0) | 2023.08.09 |
파일을 다중 요소 파일로 변환하는 중 (0) | 2023.08.09 |