尝试设置适配器:不断获取 E/RecyclerView:未连接适配器;跳过布局[重复]

Posted

技术标签:

【中文标题】尝试设置适配器:不断获取 E/RecyclerView:未连接适配器;跳过布局[重复]【英文标题】:trying to set adapter: Keep getting E/RecyclerView: No adapter attached; skipping layout [duplicate] 【发布时间】:2019-04-08 03:41:46 【问题描述】:

我在 Logcat 中不断收到此消息: E/RecyclerView:没有附加适配器;跳过布局

到目前为止,我在 *** 上搜索了很长时间,但答案似乎对我不起作用。在我看来,适配器设置正确。 我正在尝试为 android 中的应用程序实现信使功能。

我会在下面发布代码。

public class MessageListActivity extends AppCompatActivity 
    public RecyclerView mMessageRecycler;
    public MessageListAdapter mMessageAdapter;
    ArrayList<String> msgidlist = new ArrayList<String>();
    RequestQueue rq;
    String url, id_from, id_to, msgid, m_from, m_to, mnicksender, mnickreceiver, mbody,mtimestamp, mwasread;
    @Override

    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_message_list);
        id_to="2243";
        id_from="5073";
        url = "https://www.someurl.com/chat.php?id1="+id_from+"&id2="+id_to;
        rq = Volley.newRequestQueue(this);
        sendjsonrequest();
    

    public void sendjsonrequest() 
        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener<JSONArray>() 
            @Override
            public void onResponse(JSONArray response) 
                // Process the JSON
                try
                    // Loop through the array elements
                    for(int i=0;i<response.length();i++)
                        // Get current json object
                        JSONObject messages = response.getJSONObject(i);
                        // Get the current profile (json object) data
                        msgid = messages.getString("msgid");
                        m_from = messages.getString("id_from");
                        m_to = messages.getString("id_to");
                        mnicksender = messages.getString("sender");
                        mnickreceiver = messages.getString("receiver");
                        mbody = messages.getString("body");
                        mtimestamp = messages.getString("timestamp");
                        mwasread = messages.getString("wasread");
                        messageData.setmsgid(msgid);
                        messageData.setm_from(m_from);
                        messageData.setm_to(m_to);
                        messageData.setmnicksender(mnicksender);
                        messageData.setMnickreceiver(mnickreceiver);
                        messageData.setBody(mbody);
                        messageData.setTimestamp(mtimestamp);
                        messageData.setWasread(mwasread);
                        msgidlist.add(msgid);
                    
                catch (JSONException e)
                    e.printStackTrace();
                
                mMessageRecycler = findViewById(R.id.reyclerview_message_list);
                mMessageAdapter = new MessageListAdapter(MessageListActivity.this, msgidlist);
                mMessageRecycler.setLayoutManager(new LinearLayoutManager(MessageListActivity.this));
                mMessageRecycler.setAdapter(mMessageAdapter);
            

        , new Response.ErrorListener() 
            @Override
            public void onErrorResponse(VolleyError error) 
            
        );
        rq.add(jsonArrayRequest);
    


关于如何处理这个问题的任何想法。

【问题讨论】:

真的不行吗?您会看到该错误,因为您没有立即连接适配器。但是一旦你设置它,它应该填写数据。您可能应该检查msgidlist 是否为空。检查onErrorResponse()传入的error;可能存在连接问题。 【参考方案1】:

您的代码很好,但需要一些小改动

在 OnCreate 中添加以下代码行。 请记住,始终在 OnCreate 或 Activity/Fragment 的 OnResume 状态中初始化您的 UI 小部件。

mMessageRecycler = findViewById(R.id.reyclerview_message_list);

然后在 Recyclerview 小部件的声明之后在 OnCreate 或 OnResume 中添加这一行以及这一行。

mMessageRecycler.setHasFixedSize(true);

mMessageRecycler.setLayoutManager(new LinearLayoutManager(MessageListActivity.this));

然后在完成以上几行之后,您可以将适配器初始化保留在 API 响应调用中。

【讨论】:

它确实在 sethasfixedsize(true) 上给出了一些错误。你有什么理由实施这个? 你能给我看一下 logcat 消息,然后我可以告诉你问题的确切解决方案吗?与 recyclerview 合作并不是什么大不了的事【参考方案2】:

onCreate() 方法中添加以下两行并从onResponse() 中删除。在这种情况下,由于未找到视图或附加了RecyclerView 对象,它将生成nullpointer 错误或跳过布局。因此,请始终在onCreate()onResume() 活动方法中分配您的视图。

 mMessageRecycler = findViewById(R.id.reyclerview_message_list);
 mMessageRecycler.setLayoutManager(new LinearLayoutManager(MessageListActivity.this));

【讨论】:

@Fredds 试试这个 这看起来解决了这个问题。现在我可以用我的适配器解决新弹出的问题:)。谢谢 还有一个问题。执行此操作时,我收到此错误:(java nullpointerexception)引起:引起:java.lang.NullPointerException:尝试调用虚拟方法'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget .RecyclerView$LayoutManager)' 在 com.smartvibes.smartbeat.MessageListActivity.onCreate(MessageListActivity.java:40) 的空对象引用上 当您在声明recyclerView之前尝试设置布局管理器时会发生这种情况,因为当时recyclerView为空。所以首先通过 findviewById 声明它,然后添加你的布局管理器 奇怪。现在我没有连接适配器,再次跳过布局错误。 protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_message_list); mMessageRecycler = findViewById(R.id.reyclerview_message_list); mMessageRecycler.setLayoutManager(new LinearLayoutManager(MessageListActivity.this)); -再往下- mMessageAdapter = new MessageListAdapter(MessageListActivity.this, msgidlist); mMessageRecycler.setAdapter(mMessageAdapter);

以上是关于尝试设置适配器:不断获取 E/RecyclerView:未连接适配器;跳过布局[重复]的主要内容,如果未能解决你的问题,请参考以下文章

小课堂(尺寸适配)

图像视图随 Firebase 适配器不断变化

AsyncTask 不断重复 onResume

在android spinner上获取空指针

设置模型类和自定义适配器以从 onListItemClick 获取 SQLite DB rowID

改造和授权饼干