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 用のアダプタを接続しました。それではなぜ私はこのエラーを出し続けるのですか?
私は同じ問題に関連する他の質問を読みましたが、どれも助けにはなりません。
これらのステートメントを "メイン"スレッド(たとえばonCreate()
メソッド内)から呼び出していることを確認できますか「遅延」メソッドから同じステートメントを呼び出すとすぐに。私の場合はResultCallback
、私は同じメッセージが表示されます。
私のFragment
では、ResultCallback
メソッド内から以下のコードを呼び出すと、同じメッセージが表示されます。コードをアプリ内のonConnected()
メソッドに移動した後、メッセージは消えています...
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
list.setLayoutManager(llm);
list.setAdapter( adapter );
自分のコードで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" />
後者の方法を使ったチュートリアルをいくつか見ました。それが機能している間、私はそれもこのエラーを生成すると思います。
私はあなたと同じ状況を持っています、表示は大丈夫です、しかし誤りは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 {
私はこの問題を抱えている、数時間の問題は ScrollViewに置かれたrecycleView オブジェクト
実装を確認したところ、次のような理由が考えられます。 RecyclerViewがScrollViewに入れられた場合、測定ステップの間、その高さは指定されず(ScrollViewは任意の高さを許容するため)、その結果、明らかにゼロである(実装による)最小高さに等しくなります。
これを修正する方法はいくつかあります。
(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
の代わりに、 other レイアウトマネージャを使うこともできます。
これは、実際の膨らんだレイアウトが、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;
を参照します。
あなたが私のように後付けやそのようなものを使っているようなデータを待っているなら、私はこれをやってそれを修正したのと同じエラーがありました
作成前に置く
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;
}
あなたのアダプタでこのメソッドを呼び出さなかったかどうかを確認してください
@Override
public int getItemCount() {
return list.size();
}
これらの行はOnCreate
にある必要があります。
mmAdapter = new Adapter(msgList);
mrecyclerView.setAdapter(mmAdapter);
ArtistArrayAdapter adapter = new ArtistArrayAdapter(this, artists);
recyclerView = (RecyclerView) findViewById(R.id.cardList);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
上記のコードをこれに置き換えるだけで、うまくいきます。間違ったことは、レイアウトマネージャを呼び出す前にsetAdapter(アダプタ)を呼び出したことです。
私はこのエラーを解決しました。レイアウトマネージャを追加して、空のアダプタを追加するだけです。
このコードのように:
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>
これは本当にあなたが得ている単純なエラーです、これの中で少しのコードもする必要は全くありません。 このエラーは、アクティビティで使用されているレイアウトファイルが間違っているために発生します。 IDEによって、アクティビティのデフォルトレイアウトとなったレイアウトのレイアウトv21が自動的に作成されます。 私が古いレイアウトファイルと新しいレイアウトファイルで行ったすべてのコードがxmlコードをほとんど持っていなかったため、このエラーが発生しました。
解決策:古いレイアウトのすべてのコードをコピーしてレイアウトv 21に貼り付ける
私の場合、アダプタをonLocationChanged()
コールバック内に設定し、エミュレータでデバッグしていました。それは場所の変更を検出しなかったのでそれは決して発火しなかった。私がエミュレータのExtendedコントロールでそれらを手動で設定したとき、それは期待通りに働きました。
最初にアダプタを初期化します
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メソッドを呼び出すだけです。
同じ問題があり、 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();
}
私はこの問題で私の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
のようなものを使ってください。
内で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;
}
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);
}
....
私の問題は私のリサイクル業者の見解がこんな感じだったことだった
<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>
答えはそれほど多くはありませんが、コードが正しい場合でも同じ問題を抱えていました。時々、それはただ最も単純なmakeです。この場合、OPのエラーもマニフェストから<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
が欠落している可能性があります。これは同じエラーを再現します。
私の場合はそれが起こったので私は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行以内にあると私は考えています。とにかく、私はそれが単純な問題だと思う、明日それに取り組んではいけない。私はこのスレッドについて忘れる前に私が見つけたものを書くべきだと思いました。
//作成段階でアダプタを設定していない場合に発生します。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();
私の状況では、ViewHolderクラスにある忘れられたコンポーネントでしたが、レイアウトファイルにはありませんでした
この問題は、LayoutManager
にRecyclerView
を追加していないためです。
もう1つの理由は、NonUITスレッドでこのコードを呼び出しているためです。この呼び出しは必ずUITスレッドで呼び出してください。
解決策は、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);
このスレッドに出くわしたときからさらに別の答えを追加すると、エラーが発生します。私は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
を使用しなければならないことに気づくまで、エラーは謎でした。