recyclerview没有适配器连接; 跳过布局

只是在我的代码中实现了Recyclerview,取代了Listview。

一切正常。 显示对象。

但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 class="android.support.v7.widget.RecyclerView" android:id="@+id/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); 

(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允许任何高度),并且因此等于最小高度(根据实现),其明显为零。

你有几个选项来解决这个问题:

  1. 设置一定的高度RecyclerView
  2. 将ScrollView.fillViewport设置为true
  3. 或者在ScrollView之外保留RecyclerView。 在我看来,这是迄今为止最好的选择。 如果RecyclerView的高度不受限制 – 放入ScrollView的情况就是这样 – 那么所有适配器的视图都有足够的垂直位置,并一次性创建。 再也没有看到回收再利用这种打破了RecyclerView的目的。

在创建阶段没有设置适配器时会发生这种情况:

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

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

这不是最好的解决方案,但它的工作原理! 希望这是有帮助的。

我有同样的错误,我修正了这样做,如果你正在等待像我这样的数据使用改造或类似的东西

放在前面

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

这真的是一个简单的错误,你不需要做任何代码。 由于活动使用错误的布局文件,会发生此错误。 通过IDE,我自动创建了布局的布局v21,该布局成为活动的默认布局。 我在旧的布局文件和新的代码所做的所有代码只有很少的XML代码,这导致了错误。

解决方案:复制旧布局的所有代码并粘贴布局v 21

确保通过以下方式为您的RecyclerView设置布局管理器:

 mRecyclerView.setLayoutManager(new LinearLayoutManager(context)); 

而不是LinearLayoutManager ,您也可以使用其他布局管理器。

这些行必须在OnCreate

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

在我的情况下,我在模拟器中设置适配器内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 //} 

在我的情况下,它是一个被遗忘的组件,它位于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(); } 
 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)。