【问题标题】:Not able to display data from API using retrofit on a recyclerview无法使用 recyclerview 上的改造显示来自 API 的数据
【发布时间】:2019-09-28 16:14:28
【问题描述】:

主要活动

当我尝试调试应用程序时,它没有进入 on Respone 方法,在此之前它崩溃了。

public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
ArrayList<EarthQuakeObject> earthquakes;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
earthquakes =getEarthquakeData();
EarthQuakeAdapter adapter = new EarthQuakeAdapter(MainActivity.this, 
earthquakes);
LinearLayoutManager gridLayoutManager = new 
LinearLayoutManager(MainActivity.this);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(gridLayoutManager);
recyclerView.setAdapter(adapter);

}

public ArrayList<EarthQuakeObject> getEarthquakeData() {

EarthquakeApi earthquakeApi = 
RetrofitClient.getRetrofitInstance().create(EarthquakeApi.class);
Call<JSONObject> call = earthquakeApi.getEarthquakeInfo();

Log.e("MainActivity", String.valueOf(call.request().body()));


call.enqueue(new Callback<JSONObject>() {
    @Override
    public void onResponse(Call<JSONObject> call, Response<JSONObject> response) {


if(response.isSuccessful()) {
JSONObject responseObject = response.body();

try {
JSONArray array = responseObject.getJSONArray("features");
for (int i = 0; i < array.length(); i++) {
    JSONObject completeData = array.getJSONObject(i);
    JSONObject properties = completeData.getJSONObject("properties");
    double magnitude = properties.getDouble("mag");
    double time = properties.getDouble("time");
    String place = properties.getString("place");
EarthQuakeObject earthQuakeObject = new EarthQuakeObject(magnitude,place,time);
    earthquakes.add(earthQuakeObject);
}



} catch (JSONException e) {
e.printStackTrace();
  }
}


        }

    @Override
    public void onFailure(Call<JSONObject> call, Throwable t) {
        System.out.println(t.getMessage());

    }


});

return earthquakes;
}



}

适配器类

它显示一个空指针异常 - java.lang.NullPointerException: Attempt to invoke virtual method int java.util.ArrayList.size() on an null object reference

'public class EarthQuakeAdapter extends RecyclerView.Adapter<EarthQuakeAdapter.EarthQuakeViewHolder>{
private Context mctx;
private ArrayList<EarthQuakeObject> earthQuakeObjectList;

public EarthQuakeAdapter(Context mctx, ArrayList<EarthQuakeObject> earthQuakeObjectList) {
    this.mctx = mctx;
    this.earthQuakeObjectList = earthQuakeObjectList;
}

@NonNull
@Override
public EarthQuakeViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(mctx).inflate(R.layout.grid_layout,parent,false);
    return new EarthQuakeViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull EarthQuakeViewHolder holder, int position) {
    EarthQuakeObject earthQuakeObject = earthQuakeObjectList.get(position);
    holder.mag.setText(""+earthQuakeObject.getmMagnitude());
    holder.place.setText(earthQuakeObject.getmPlace());
    holder.date.setText(""+earthQuakeObject.getmDate());


}

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

public class EarthQuakeViewHolder extends RecyclerView.ViewHolder {
    TextView mag;
    TextView place;
  TextView date;
    public EarthQuakeViewHolder(@NonNull View itemView) {
        super(itemView);

        mag =itemView.findViewById(R.id.mag);
        place = itemView.findViewById(R.id.place);
        date = itemView.findViewById(R.id.date);
    }



}

}

模型类

public class EarthQuakeObject implements Serializable {
@SerializedName("mag")
private double mMagnitude;
@SerializedName("place")
private  String mPlace;
@SerializedName("time")
private  double mDate;

public EarthQuakeObject(double mMagnitude, String mPlace, double mDate) {
    this.mMagnitude = mMagnitude;
    this.mPlace = mPlace;
    this.mDate = mDate;
}

public double getmMagnitude() {
    return mMagnitude;
}

public void setmMagnitude(double mMagnitude) {
    this.mMagnitude = mMagnitude;
}

public String getmPlace() {
    return mPlace;
}

public void setmPlace(String mPlace) {
    this.mPlace = mPlace;
}

public double  getmDate() {
    return mDate;
}

public void setmDate(double mDate) {
    this.mDate = mDate;

}
}'

标题

改装班

public class RetrofitClient {
private static Retrofit retrofit;
private static final String base_url ="https://earthquake.usgs.gov";

public static Retrofit getRetrofitInstance(){

if(retrofit== null){

retrofit = new Retrofit.Builder()
    .baseUrl(base_url)
    .addConverterFactory(GsonConverterFactory.create())
    .build();
}

    return  retrofit;
    }
}  

界面

public interface EarthquakeApi {


@GET("/fdsnws/event/1/query?format=geojson&starttime=2016-01-01&endtime=2016-01-31&minmag=6&limit=10")
Call<JSONObject> getEarthquakeInfo();
}

错误日志

2019-09-26 19:38:10.724 6634-6634/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.quakereport, PID: 6634
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference
    at com.example.quakereport.EarthQuakeAdapter.getItemCount(EarthQuakeAdapter.java:46)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3834)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3639)
    at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4194)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:446)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at com.android.internal.policy.DecorView.onLayout(DecorView.java:726)
    at android.view.View.layout(View.java:17637)
    at android.view.ViewGroup.layout(ViewGroup.java:5575)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2346)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2068)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6337)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
    at android.view.Choreographer.doCallbacks(Choreographer.java:686)
    at android.view.Choreographer.doFrame(Choreographer.java:621)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

【问题讨论】:

  • 您的错误解释了一切。当您创建适配器对象时,您发送 null 而不是 arraylist,并且在方法 getItemCound 中,当它尝试查找 null 列表的长度时,它会崩溃以避免此检查 getItemCount 方法中的可空性
  • 谢谢它解决了空指针异常,但数据仍然没有显示在应用程序上。

标签: java android


【解决方案1】:

初始化。地震前 MainActivity 中的 ArrayList =getEarthquakeData();

like ArrayList地震= new ArraryList();

您看到此错误 (java.lang.NullPointerException) 因为 earthQuakeObjectList.size(); 为空。

【讨论】:

  • 感谢它解决了空指针异常,但应用程序上仍然没有显示数据。
  • 现在再次调试您的应用程序并查看 onResponse 或 onFailure 变量中的下一个错误
  • 我现在正在获取响应数据,我也可以将对象添加到数组列表中,但是当我返回数组列表时,它返回 null。所以我无法填充recyclerview。
  • 您需要在 onResponse 方法中的 for 循环之后通知您的适配器有关数据更改调用 adapter.notifyDataSetChanged()
  • 这是我的荣幸
【解决方案2】:

您从响应中获得了一个空数组列表。以下是您的 api 请求中的一些更改

Call<JsonObject> call = earthquakeApi.getEarthquakeInfo();
    call.enqueue(new Callback<JsonObject>() {
        @Override
        public void onResponse(Call<JsonObject> call, Response<JsonObject> response) 
        {

            if (response.isSuccessful()) {
                JSONObject responseObject = response.body();

                try {
                        JsonArray jsonArray response.body().get("features").getAsJsonArray();

                        Log.e("Response.....", "-----//array//----" + jsonArray);
                        for (int i = 0; i < jsonArray.size(); i++) {
                            Log.e("TAG", "---item---" + jsonArray.get(i));
                        }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }


        }

        @Override
        public void onFailure(Call<JSONObject> call, Throwable t) {
            System.out.println(t.getMessage());

        }


    });

我只是打印数组对象列表来显示数据。您可以将此列表传递给回收站视图。

希望,它对你有用!!

【讨论】:

  • 是的,我的json解析有问题,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 2020-09-03
  • 1970-01-01
  • 2019-11-23
  • 2021-06-23
  • 2021-11-08
  • 1970-01-01
相关资源
最近更新 更多