recyclerview无适配器连接;跳过布局

v6ylcynt  于 2021-06-29  发布在  Java
关注(0)|答案(30)|浏览(554)

刚刚实施 RecyclerView 在我的代码中,替换 ListView .
一切正常。显示数据。
但正在记录错误消息:

15:25:53.476 E/RecyclerView: No adapter attached; skipping layout

15:25:53.655 E/RecyclerView: No adapter attached; skipping layout

对于以下代码:

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

如你所见,我已附加了一个适配器 RecyclerView . 那为什么我总是犯这个错误呢?
我读过与同一问题有关的其他问题,但没有一个有用。

hjzp0vay

hjzp0vay1#

这些线必须在 OnCreate :

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

vkc1a9a22#

我有这个问题,有几次的问题是循环查看放在scrollview对象中
在检查实现之后,原因似乎如下。如果将recyclerview放入scrollview中,那么在测量步骤中,它的高度是未指定的(因为scrollview允许任何高度),因此,它等于最小高度(根据实现),这显然是零。
您有两个选项可以解决此问题:
将一定高度设置为recyclerview
将scrollview.fillviewport设置为true
或者将recyclerview放在scrollview之外。在我看来,这是迄今为止最好的选择。如果recyclerview高度不受限制(在scrollview中就是这样),那么所有适配器的视图都有足够的垂直位置,可以一次创建所有视图。再也没有循环利用的观点了,这有点违背了循环利用观点的目的。
(可跟踪 android.support.v4.widget.NestedScrollView 以及)

tcbh2hod

tcbh2hod3#

通过在底部设置初始化的空列表和适配器,并在获取结果时调用notifydatasetchanged来解决。

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

wztqucjr4#

我也遇到了同样的问题,并意识到在从源代码检索数据之后,我同时设置了layoutmanager和adapter,而不是在oncreate方法中设置这两个。

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

wnavrhmk5#

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

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

7fhtutme

7fhtutme6#

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

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

nbewdwxp7#

我已经解决了这个错误。您只需要添加布局管理器并添加空适配器。
像这样的代码:

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
//}
egdjgwm8

egdjgwm88#

添加另一个答案,因为我发现这个线程谷歌的错误。我想初始化一个 PreferenceFragmentCompat 但我忘了在xml中夸大偏好 onCreatePreferences 这样地:

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 内部。

sf6xfgos

sf6xfgos9#

对于那些使用 RecyclerView片段中,并从其他视图将其充气:在充气整个片段视图时,请确保绑定 RecyclerView 到它的根视图。
我正在连接并正确地为适配器执行所有操作,但我从未执行绑定。这个由@prateek agarwal给出的答案对我来说已经足够了,但是这里有更多的细节。

Kotlin

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

evrscar210#

在Kotlin我们遇到了一个奇怪的不合逻辑的问题。
这不起作用:

mBinding.serviceProviderCertificates.apply {
            adapter = adapter
            layoutManager =  LinearLayoutManager(activity)
        }

当这起作用时:

mBinding.serviceProviderCertificates.adapter = adapter
mBinding.serviceProviderCertificates.layoutManager = LinearLayoutManager(activity)

一旦下班后我得到更多,我会分享更多的见解。

xxe27gdn

xxe27gdn11#

在我的情况下,我是在里面设置适配器 onLocationChanged() 在模拟器中进行回调和调试。因为它没有检测到位置改变,所以它从未开火。当我在模拟器的扩展控件中手动设置它们时,它按预期工作。

jslywgbw

jslywgbw12#

此问题是因为您没有添加任何 LayoutManager 为了你的 RecyclerView .
另一个原因是您在非uithread中调用此代码。确保在uithread中调用此调用。
解决办法是你只需要加一个 LayoutManager 对于 RecyclerView 在你之前 setAdapter 在ui线程中。

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

ki1q1bka13#

在我的例子中,这是因为我在线性布局中嵌入了一个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"/>

我相信问题出在三条线之间。不管怎样,我认为这是一个简单的问题,我明天就着手解决;我想我应该在忘记这条线索之前把我发现的写下来。

zrfyljdw

zrfyljdw14#

检查是否错过了在适配器中调用此方法

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

kxkpmulp15#

只需将以下内容添加到 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>

相关问题