IT story

recyclerview 어댑터가 연결되지 않았습니다.

hot-time 2020. 5. 6. 21:06
반응형

recyclerview 어댑터가 연결되지 않았습니다. 레이아웃 건너 뛰기


Listview를 대체하여 내 코드에서 Recyclerview를 구현했습니다.

모든 것이 잘 작동합니다. 객체가 표시됩니다.

하지만 logcat은 말합니다

15 : 25 : 53.476 E / RecyclerView ﹕ 어댑터가 연결되지 않았습니다. 레이아웃 건너 뛰기

15 : 25 : 53.655 E / RecyclerView ﹕ 어댑터가 연결되지 않았습니다. 레이아웃 건너 뛰기

코드

ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

보시다시피 Recycleview 용 어댑터를 연결했습니다 . 왜이 오류가 계속 발생합니까?

동일한 문제와 관련된 다른 질문을 읽었지만 도움이되지 않습니다.


"메인"스레드 (예 : 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를 초기화하고 어댑터를 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();

다음과 같이 RecyclerView의 레이아웃 관리자를 설정하십시오.

mRecyclerView.setLayoutManager(new LinearLayoutManager(context));

대신 다른 레이아웃 관리자를 LinearLayoutManager사용할 수도 있습니다 .


개조 또는 이와 유사한 것을 사용하여 나와 같은 데이터를 기다리는 경우이 작업을 수행하는 것과 동일한 오류가 발생했습니다.

Oncreate에 넣기

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

이 줄은 다음에 있어야합니다 OnCreate.

mmAdapter = new Adapter(msgList);
mrecyclerView.setAdapter(mmAdapter);

실제 부풀린 레이아웃이 recyclerView를 찾는 동안 참조한 레이아웃과 다르기 때문에 발생합니다. 조각을 만들 때 기본적으로 onCreateView 메서드는 다음과 같이 나타납니다.return inflater.inflate(R.layout.<related layout>,container.false);

그 대신, 별도로 뷰를 작성하고 그것을 사용하여 recyclerView를 참조하십시오. View view= inflater.inflate(R.layout.<related layout>,container.false); recyclerview=view.findViewById(R.id.<recyclerView ID>); return view;


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

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

ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);

위의 코드를 이것으로 바꾸면 작동합니다. 당신이 잘못한 것은 레이아웃 관리자를 호출하기 전에 setAdapter (adapter)라는 것입니다.


이것은 실제로 발생하는 간단한 오류이므로 코드를 작성할 필요가 없습니다. 이 오류는 활동에 사용 된 잘못된 레이아웃 파일로 인해 발생합니다. IDE에 의해 자동으로 활동의 기본 레이아웃이 된 레이아웃의 레이아웃 v21을 만들었습니다. 이전 레이아웃 파일에서 수행 한 모든 코드와 새 코드에는 XML 코드가 거의 없으므로 오류가 발생했습니다.

솔루션 : 이전 레이아웃의 모든 코드를 복사하여 레이아웃 v 21에 붙여 넣기


제 경우에는 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
//}

먼저 어댑터를 초기화하십시오.

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 메소드를 호출하십시오.


다음을 추가하십시오. 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>

조각RecyclerView 내에서 조각 을 사용하고 다른보기에서 부 풀리는 사람들을 위해 : 전체 조각보기를 부 풀릴 때 RecyclerView루트보기에 바인딩해야합니다 .

어댑터에 대한 모든 것을 올바르게 연결하고 수행했지만 바인딩을 한 적이 없습니다. 대답 하여 @Prateek 아가 왈은 나를 위해 모든 것을 가지고 있지만, 여기에 더 정교하다.

코 틀린

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

내 상황에서 그것은 ViewHolder 클래스에있는 잊혀진 구성 요소 였지만 레이아웃 파일에 없었습니다.


나는 같은 문제가 있었고 onCreate 메소드 에서 두 가지를 설정하는 대신 소스에서 데이터를 검색 한 후 LayoutManage r과 어댑터를 모두 설정하고 있음을 깨달았습니다 .

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입니다.

또 다른 이유는 NonUIThread에서이 코드를 호출하기 때문입니다. UIThread에서이 호출을 호출하십시오.

이 솔루션은 단지 당신은 추가해야한다 LayoutManager위해 RecyclerView전에 setAdapterUI 스레드에서.

recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

내 문제는 내 재활용 뷰가 다음과 같이 보였습니다.

        <android.support.v7.widget.RecyclerView
        android:id="@+id/chatview"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">
    </android.support.v7.widget.RecyclerView>

이처럼 보일 때

       <android.support.v7.widget.RecyclerView
        android:id="@+id/chatview"
        android:layout_width="395dp"
        android:layout_height="525dp"
        android:layout_marginTop="52dp"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="8dp"></android.support.v7.widget.RecyclerView>
</android.support.constraint.ConstraintLayout>

당신에 RecyclerView어댑터 클래스, 예를 들어 MyRecyclerViewAdapter, 다음과 같은 PARAMS와 생성자를합니다.

MyRecyclerViewAdapter(Context context, List<String> data) {
    this.mInflater = LayoutInflater.from(context); // <-- This is the line most people include me miss
    this.mData = data;
}

mData어댑터에 전달할 데이터입니다. 전달할 데이터가없는 경우 선택 사항입니다. 작성하고 어댑터 기능에 사용 mInflater하는 LayoutInflater오브젝트입니다 OnCreateViewHolder.

그런 다음 MainActivity 또는 메인 / UI 스레드에서 원하는 위치에 어댑터를 올바르게 연결하십시오.

MyRecyclerViewAdapter recyclerAdapter;
OurDataStuff mData;

    ....
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Like this:

        RecyclerView recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerAdapter = new RecyclerAdapter(this, mData); //this, is the context. mData is the data you want to pass if you have any
        recyclerView.setAdapter(recyclerAdapter);
    }
   ....

초기화 된 빈 목록과 어댑터를 맨 아래에 설정하고 결과를 가져올 때 notifyDataSetChanged를 호출하여 해결되었습니다.

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
    recyclerviewItems.setLayoutManager(linearLayoutManager);
    someAdapter = new SomeAdapter(getContext(),feedList);
    recyclerviewItems.setAdapter(someAdapter);

나는이 문제로 16 분의 삶을 잃어 버렸기 때문에 내가 만들고있는이 엄청나게 창피한 실수를 인정할 것입니다-Butterknife를 사용하고 있으며이 조각의 onCreateView에서 뷰를 바인딩합니다.

왜 레이아웃 관리자가 없는지 알아내는 데 오랜 시간이 걸렸습니다. 그러나 실제로 뷰가 삽입되어 실제로 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


답은 많지 않지만 코드가 정확하더라도 동일한 문제가 발생했습니다. 때로는 가장 단순한 것입니다. 이 경우 OP의 오류가 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />매니페스트에서 누락 되어 동일한 오류가 재현 될 수 있습니다 .


제 경우에는 LinearLayout에 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했지만 onCreatePreferences다음과 같이 환경 설정 XML을 팽창시키는 것을 잊었습니다 .

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.


// 생성 단계에서 어댑터를 설정하지 않으면 발생합니다. api 응답이 작동 할 때 notifyDataSetChanged ()를 호출하십시오.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);


        magazineAdapter = new MagazineAdapter(getContext(), null, this );
        newClipRecyclerView.setAdapter(magazineAdapter);
        magazineAdapter.notifyDataSetChanged();

       APICall();
}

public void APICall() {
    if(Response.isSuccessfull()){
    mRecyclerView.setAdapter(mAdapter);
   }
}
Just move setting the adapter into onCreate with an empty data and when you have the data call:

mAdapter.notifyDataSetChanged();

참고 URL : https://stackoverflow.com/questions/29141729/recyclerview-no-adapter-attached-skipping-layout

반응형