【问题标题】:No adapter attached; skipping layout while using volley未连接适配器;使用 volley 时跳过布局
【发布时间】:2021-09-08 19:23:53
【问题描述】:

我在这里使用 volley 通过我的 api 从 xampp 服务器获取数据(在邮递员上工作正常) 但是在运行代码时得到这个,一旦应用程序打开并且应用程序不会崩溃,就会显示定义 onErrorResponse 的 Toast。 阅读了很多解决方案,很多都与片段有关..我没有使用片段...... 同样在我的代码中,我认为当我在 recyclerview 上调用 setAdapter 方法时,我刚刚在它上面定义了 myAdapter

MyAdapter myAdapter = new MyAdapter(data);
recyclerView.setAdapter(myAdapter);

主要活动.java

package com.example.poetryapp;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.example.poetryapp.adapter.MyAdapter;
import com.example.poetryapp.model.PoetryModel;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
    RecyclerView recyclerView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.poetry_recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));


        loaddata();
    }

    private void loaddata() {

        String url = "http://192.168.137.198/poetryapi/getPoetryRead.php.php";

        StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new com.android.volley.Response.Listener<String>() {
            @Override
            public void onResponse(String response) {

                GsonBuilder gsonBuilder = new GsonBuilder();
                Gson gson = gsonBuilder.create();

                PoetryModel data[]=gson.fromJson(response,PoetryModel[].class);

                MyAdapter myAdapter = new MyAdapter(data);
                recyclerView.setAdapter(myAdapter);
                myAdapter.notifyDataSetChanged();

                Log.e("success",response);
            }
        }, new com.android.volley.Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(),error.toString(),Toast.LENGTH_LONG).show();
            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String,String> params=new HashMap<>();
                return params;
            }
        };
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);



    }
    }

MyAdapter.java

package com.example.poetryapp.adapter;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.poetryapp.R;
import com.example.poetryapp.model.PoetryModel;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.viewHolder> {

    PoetryModel data[];

    public MyAdapter(PoetryModel[] data) {
        this.data = data;
    }

    @NonNull
    @Override
    public viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.poetry_list_view,parent,false);
        return new viewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull viewHolder holder, int position) {
        holder.t1_name.setText(data[position].getPoet_name());
        holder.t2_data.setText(data[position].getPoetry_data());
        holder.t3_date_time.setText(data[position].getDate_time());
    }

    @Override
    public int getItemCount() {
        return data.length;
    }

    class viewHolder extends RecyclerView.ViewHolder{
        TextView t1_name,t2_data,t3_date_time;
        public viewHolder(@NonNull View itemView) {
            super(itemView);

            t1_name=itemView.findViewById(R.id.tv_poetName);
            t2_data=itemView.findViewById(R.id.tv_poetryData);
            t3_date_time=itemView.findViewById(R.id.tv_poet_dateTime);

        }
    }


}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/main_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/black" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/main_toolbar"
        android:orientation="vertical"
        >

        <androidx.recyclerview.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/poetry_recyclerView"
            />

    </LinearLayout>

</RelativeLayout>

logcat 错误信息

2021-09-09 09:38:45.963 29496-29496/com.example.poetryapp E/RecyclerView: No adapter attached; skipping layout
2021-09-09 09:38:46.004 29496-29496/com.example.poetryapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.poetryapp, PID: 29496
    com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
        at com.google.gson.Gson.fromJson(Gson.java:944)
        at com.google.gson.Gson.fromJson(Gson.java:897)
        at com.google.gson.Gson.fromJson(Gson.java:846)
        at com.google.gson.Gson.fromJson(Gson.java:817)
        at com.example.poetryapp.MainActivity$1.onResponse(MainActivity.java:53)
        at com.example.poetryapp.MainActivity$1.onResponse(MainActivity.java:46)
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:82)
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:29)
        at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7868)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:981)
     Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
        at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:349)
        at com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:70)
        at com.google.gson.Gson.fromJson(Gson.java:932)
        at com.google.gson.Gson.fromJson(Gson.java:897) 
        at com.google.gson.Gson.fromJson(Gson.java:846) 
        at com.google.gson.Gson.fromJson(Gson.java:817) 
        at com.example.poetryapp.MainActivity$1.onResponse(MainActivity.java:53) 
        at com.example.poetryapp.MainActivity$1.onResponse(MainActivity.java:46) 
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:82) 
        at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:29) 
        at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102) 
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.app.ActivityThread.main(ActivityThread.java:7868) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:981) 

我的网址返回这个

{
    "status": "1",
    "message": "record is not empty",
    "data": [
        {
            "id": "1",
            "poetry_data": "shdoqw djwaiood aand od sodnh asisd d ashd asidhas das das doaisdhas dsa d as diwdhw xs dw wh codfj e",
            "poet_name": "abcd efg",
            "date_time": "2021-09-02 08:32:10"
        },
        {
            "id": "2",
            "poetry_data": "updating this",
            "poet_name": "abc",
            "date_time": "2021-09-04 10:38:22"
        },
        {
            "id": "4",
            "poetry_data": "aaaaaaaaaaaa bbbbbbbbbbbbb cccccccccccccc",
            "poet_name": "abc",
            "date_time": "2021-09-02 10:11:08"
        },
        {
            "id": "5",
            "poetry_data": "aaaaaaaaaaaaaaaaaaaaa",
            "poet_name": "aa",
            "date_time": "2021-09-03 10:16:08"
        },
        {
            "id": "6",
            "poetry_data": "aaaaaaaaaaaaaaaaaaaaa",
            "poet_name": "aa",
            "date_time": "2021-09-03 10:16:22"
        },
        {
            "id": "7",
            "poetry_data": "aaaaaaaaaaaaaaaaaaaaa",
            "poet_name": "aa",
            "date_time": "2021-09-03 10:17:04"
        },
        {
            "id": "8",
            "poetry_data": "",
            "poet_name": "",
            "date_time": "2021-09-06 09:19:39"
        },
        {
            "id": "9",
            "poetry_data": "",
            "poet_name": "",
            "date_time": "2021-09-06 09:23:38"
        },
        {
            "id": "10",
            "poetry_data": "",
            "poet_name": "",
            "date_time": "2021-09-06 09:24:00"
        },
        {
            "id": "11",
            "poetry_data": "bhdjasvjguuuuuuuuuuuuuuuu",
            "poet_name": "nameisname",
            "date_time": "2021-09-06 09:29:59"
        },
        {
            "id": "12",
            "poetry_data": "bhdjasvjguuuuuuuuuuuuuuuu",
            "poet_name": "abara",
            "date_time": "2021-09-06 09:42:43"
        },
        {
            "id": "13",
            "poetry_data": "bhdjasvjguuuuuuuuuuuuuuuu",
            "poet_name": "kkkkkkkhgvghytu",
            "date_time": "2021-09-06 09:52:21"
        }
    ]
}

第二个错误与 gson 有关,但我不知道如何正确编写它以将 json 解析为 gson 以获得我的 url 返回的结构。

谢谢!

【问题讨论】:

    标签: java android android-studio android-recyclerview


    【解决方案1】:

    你试过了吗

    myAdapter.notifyDataSetChanged()
    

    在您的主要活动中的这一行之后?

    recyclerView.setAdapter(myAdapter);
    

    【讨论】:

    • 现在试过recyclerView.setAdapter(myAdapter); myAdapter.notifyDataSetChanged(); 但现在我的错误logcat 有新错误,先生上面的更新代码
    • 现在从 api 获取数据的错误是一个解析错误,这意味着您获取的数据响应错误,因为您的实际数据位于大对象 yourrespons.yourdata 中。现在我说这只是为了解释你为什么会遇到这个错误并在将来避免它。现在你可以按照@Abhishek Ippakayal 所说的来解决这个错误。以后你可以去这个网站写你的回复。 jsonschema2pojo.org
    • 另外只是一个小建议,可以编写更实用的代码来遵循 MVVM 结构和存储库并使用视图模型进行改造,看看视图绑定,它比 findviewbyid 更容易获取视图。谷歌有一个很好的例子,一开始你可以不理解所有内容。祝你好运!
    【解决方案2】:

    看到你的错误日志和你的 api 响应 json,你解析错了。 您的响应类应如下所示。

    class PoetryResponse() {
       @Serializable("status")
       String status;
    
       @Serializable("message")
       String message;
    
       @Serializable("data")
       Poetry[] data;
    
    }
    

    你的数据对象类

    class Poetry() {
     @Serializable("id")
       String id;
    
       @Serializable("poetry_data")
       String poetryData;
    
       @Serializable("poet_name")
       String poetName;
       
       @Serializable("date_time")
       String dateTime;
    }
    

    使用以下代码从 json 获取响应

    PoetryResponse poetryResponse = gson.fromJson(response,PoetryResponse.class);
    

    现在在你的适配器中传递如下诗歌的数组列表

    MyAdapter myAdapter = new MyAdapter(poetryResponse.data);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 2021-04-24
      • 2020-03-12
      • 1970-01-01
      相关资源
      最近更新 更多