태그 보관물: recycler-adapter

recycler-adapter

recyclerview 연결된 어댑터가 없습니다. 레이아웃 건너 뛰기 attached; skipping layout 다음 코드의 경우 : ArtistArrayAdapter

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 . 왜이 오류가 계속 발생합니까?

같은 문제와 관련된 다른 질문을 읽었지만 그중 어느 것도 도움이되지 않습니다.



답변

“메인”스레드 (예 : onCreate()메소드 내부 ) 에서이 명령문을 호출하고 있는지 확인할 수 있습니다 . “지연된”메소드에서 동일한 명령문을 호출하자마자. 제 경우 ResultCallback에는 같은 메시지가 나타납니다.

Fragment에서 ResultCallback메소드 내부에서 아래 코드를 호출 하면 동일한 메시지가 생성됩니다. onConnected()내 앱 내의 메소드로 코드를 옮긴 후 메시지가 사라졌습니다.

LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );

답변

내 코드에서 두 가지를 고칠 때까지 동일한 두 가지 오류 메시지가 나타납니다.

(1) 기본적으로 메소드를 구현하면 RecyclerView.Adapter다음을 생성합니다.

@Override
public int getItemCount() {
    return 0;
}

다음과 같이 코드를 업데이트하십시오.

@Override
public int getItemCount() {
    return artists.size();
}

항목에 항목이없는 경우 화면에 아무 것도 표시되지 않습니다.

(2) 상단 답변에 표시된 것처럼이 작업을 수행하지 않았습니다 : 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);

(3) 편집 : 보너스 : 또한 다음 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 & bind 어댑터 ON CREATE () 초기화

RecyclerView mRecycler = (RecyclerView) this.findViewById(R.id.yourid);
mRecycler.setAdapter(adapter);

(2) 데이터를 가져올 때 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();
                }

            }
        }
    };

dispatchLayout ()에서 오류가 있음을 알 수 있습니다.

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 {

답변

이 문제가 있습니다. 몇 번 문제는 recycleView를 ScrollView에 넣습니다. 객체에

구현을 확인한 후 그 이유는 다음과 같습니다. RecyclerView가 ScrollView에 들어가면 측정 단계 동안 높이가 지정되지 않고 (ScrollView가 모든 높이를 허용하기 때문에) 0으로 보이는 최소 구현 높이와 같습니다.

이 문제를 해결하기위한 몇 가지 옵션이 있습니다.

  1. 특정 높이를 RecyclerView로 설정하십시오.
  2. ScrollView.fillViewport를 true로 설정하십시오.
  3. 또는 RecyclerView를 ScrollView 외부에 유지하십시오. 제 생각에는 이것이 가장 좋은 옵션입니다. RecyclerView 높이가 제한되지 않으면 (이것이 ScrollView에 놓인 경우) 모든 어댑터의보기에는 세로로 충분한 위치가 있고 한 번에 모두 생성됩니다. 더 이상 RecyclerView의 목적을 어기는 뷰 재활용이 없습니다.

(따라서 따를 수 있음 android.support.v4.widget.NestedScrollView)


답변

1) 아무것도하지 않는 ViewHolder 를 만듭니다. 🙂

// SampleHolder.java
public class SampleHolder extends RecyclerView.ViewHolder {
    public SampleHolder(View itemView) {
        super(itemView);
    }
}

2) 다시 아무것도하지 않는 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;
    }
}

3) 이제 실제 리사이클 러가 준비되지 않은 경우 아래의 샘플을 사용하십시오.

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

빈 데이터로 데이터 호출이있을 때 어댑터 설정을 onCreate로 이동하면됩니다.

mAdapter.notifyDataSetChanged();

답변

어댑터에서이 메소드를 호출하지 않았는지 확인하십시오.

@Override
public int getItemCount() {
    return list.size();
}