web-dev-qa-db-ja.com

recyclerviewアダプターは取り付けられていません。スキップレイアウト

Listviewを置き換えて、Recyclerviewを私のコードに実装しただけです。

すべてうまくいきます。オブジェクトが表示されます。

しかしlogcatは言う

15:25:53.476 E/RecyclerView adapterアダプターが取り付けられていません。スキップレイアウト

15:25:53.655 E/RecyclerView adapterアダプターが取り付けられていません。スキップレイアウト

コード用

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

ご覧のとおり、私は Recycleview 用のアダプタを接続しました。それではなぜ私はこのエラーを出し続けるのですか?

私は同じ問題に関連する他の質問を読みましたが、どれも助けにはなりません。

185
equitharn

これらのステートメントを "メイン"スレッド(たとえばonCreate()メソッド内)から呼び出していることを確認できますか「遅延」メソッドから同じステートメントを呼び出すとすぐに。私の場合はResultCallback、私は同じメッセージが表示されます。

私のFragmentでは、ResultCallbackメソッド内から以下のコードを呼び出すと、同じメッセージが表示されます。コードをアプリ内のonConnected()メソッドに移動した後、メッセージは消えています...

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

自分のコードで2つのことを修正するまで、同じ2つのエラーメッセージが表示されました。

(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" />

後者の方法を使ったチュートリアルをいくつか見ました。それが機能している間、私はそれもこのエラーを生成すると思います。

36
Micro

私はあなたと同じ状況を持っています、表示は大丈夫です、しかし誤りはlocatに現れます。それが私の解決策です:(1)RecyclerView&bindアダプタを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 {
19
Keith Gong

私はこの問題を抱えている、数時間の問題は ScrollViewに置かれたrecycleView オブジェクト

実装を確認したところ、次のような理由が考えられます。 RecyclerViewがScrollViewに入れられた場合、測定ステップの間、その高さは指定されず(ScrollViewは任意の高さを許容するため)、その結果、明らかにゼロである(実装による)最小高さに等しくなります。

これを修正する方法はいくつかあります。

  1. RecyclerViewに一定の高さを設定
  2. ScrollView.fillViewportをtrueに設定します
  3. またはRecyclerViewをScrollViewの外に置いてください。私の意見では、これははるかに最良の選択肢です。 RecyclerViewの高さが制限されていない場合(ScrollViewに配置される場合)、すべてのアダプタのビューは垂直方向に十分な位置を占め、一度に作成されます。 RecyclerViewの目的を破るビューリサイクルはもうありません。

Android.support.v4.widget.NestedScrollViewにも従うことができます)

11
FxRi4

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

これは最良の解決策ではありませんが、うまくいきます。これが役に立つことを願っています。

9
Madan Sapkota

作成段階でアダプタを設定していない場合に起こります。

@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();
6
Peter File

以下の方法でRecyclerViewのレイアウトマネージャを設定してください。

mRecyclerView.setLayoutManager(new LinearLayoutManager(context));

LinearLayoutManagerの代わりに、 other レイアウトマネージャを使うこともできます。

3
Sumit Jha

これは、実際の膨らんだレイアウトが、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;を参照します。

2
Prateek Agarwal

あなたが私のように後付けやそのようなものを使っているようなデータを待っているなら、私はこれをやってそれを修正したのと同じエラーがありました

作成前に置く

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

あなたのアダプタでこのメソッドを呼び出さなかったかどうかを確認してください

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

これらの行はOnCreateにある必要があります。

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

上記のコードをこれに置き換えるだけで、うまくいきます。間違ったことは、レイアウトマネージャを呼び出す前にsetAdapter(アダプタ)を呼び出したことです。

1
Pradeep Bogati

私はこのエラーを解決しました。レイアウトマネージャを追加して、空のアダプタを追加するだけです。

このコードのように:

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
//}
1
mehdi janbarari

以下を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>
1
Alan Deep

これは本当にあなたが得ている単純なエラーです、これの中で少しのコードもする必要は全くありません。 このエラーは、アクティビティで使用されているレイアウトファイルが間違っているために発生します。 IDEによって、アクティビティのデフォルトレイアウトとなったレイアウトのレイアウトv21が自動的に作成されます。 私が古いレイアウトファイルと新しいレイアウトファイルで行ったすべてのコードがxmlコードをほとんど持っていなかったため、このエラーが発生しました。

解決策:古いレイアウトのすべてのコードをコピーしてレイアウトv 21に貼り付ける

1
Vikash Sharma

私の場合、アダプタをonLocationChanged()コールバック内に設定し、エミュレータでデバッグしていました。それは場所の変更を検出しなかったのでそれは決して発火しなかった。私がエミュレータのExtendedコントロールでそれらを手動で設定したとき、それは期待通りに働きました。

1
saiyancoder

最初にアダプタを初期化します

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メソッドを呼び出すだけです。

1
Roger

同じ問題があり、 onCreate メソッドで2つを設定する代わりに、ソースからデータを取得した後に LayoutManage rと adapter の両方を設定していることに気付きました。

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();
                    }
0
ovicko

私はこの問題で私の16分の命を失ったので、私がしていたというこの信じられないほど厄介な間違いに私はただ認めます。

レイアウトマネージャがなかった理由を理解するのに長い時間がかかりました - しかし明らかにビューは注入されるので実際に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のようなものを使ってください。

0
Saik Caskey

内で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
}

Java

  @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;
}
0
N. Osil

RecyclerViewアダプタクラス、たとえばMyRecyclerViewAdapterでは、次のパラメータを使用してコンストラクタを作成します。

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

私の問題は私のリサイクル業者の見解がこんな感じだったことだった

        <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>
0

答えはそれほど多くはありませんが、コードが正しい場合でも同じ問題を抱えていました。時々、それはただ最も単純なmakeです。この場合、OPのエラーもマニフェストから<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />が欠落している可能性があります。これは同じエラーを再現します。

0
SpicyWeenie

私の場合はそれが起こったので私はLinearLayoutにRecyclerViewを埋め込んだ。

私は以前以下のように1つのルート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行以内にあると私は考えています。とにかく、私はそれが単純な問題だと思う、明日それに取り組んではいけない。私はこのスレッドについて忘れる前に私が見つけたものを書くべきだと思いました。

0
SoliQuiD

//作成段階でアダプタを設定していない場合に発生します。API応答が取得されているときにnotifyDataSetChanged()を呼び出しますIts Working

@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();
0
Keshav Gera

私の状況では、ViewHolderクラスにある忘れられたコンポーネントでしたが、レイアウトファイルにはありませんでした

0
lomec

この問題は、LayoutManagerRecyclerViewを追加していないためです。

もう1つの理由は、NonUITスレッドでこのコードを呼び出しているためです。この呼び出しは必ずUITスレッドで呼び出してください。

解決策は、UIスレッドでLayoutManagerを実行する前にRecyclerViewsetAdapterを追加するだけです。

recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
0
Khalid Taha

下部に初期化された空のリストとアダプタを設定し、結果がフェッチされたときにnotifyDataSetChangedを呼び出すことによって解決されました。

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

このスレッドに出くわしたときからさらに別の答えを追加すると、エラーが発生します。私は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を使用しなければならないことに気づくまで、エラーは謎でした。

0
aschmied