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允许任何高度),并且因此等于最小高度(根据实现),其明显为零。
你有几个选项来解决这个问题:
- 设置一定的高度RecyclerView
- 将ScrollView.fillViewport设置为true
- 或者在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)。