Я новичок в дооснащении2 Android. Я пытаюсь обойти приложение, которое отображает информацию о землетрясениях с помощью модернизации и RecyclerView. Но я не могу отобразить какую-либо выборку данных из URL в формате JSON.
В большинстве случаев у меня нет подключенного адаптера; ошибка пропуска макета. Я много искал, но не понял.
Я использую HttpLoggingInterceptor, чтобы увидеть ответ. Тело ответа моих данных JSON отображается в подробном отчете Logcat, но не в RecyclerView.
Иногда нет ошибок ничего в подробном все пусто, даже приложение пусто без данных.
Помогите мне пожалуйста с моей проблемой.
URL, с которого я получаю данные. Я ограничиваю его до 2, чтобы вы могли видеть это ясно.
https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&limit=2
Это моя основная деятельность.
public class EarthquakeActivity extends AppCompatActivity {
private static final String TAG = EarthquakeActivity.class.getSimpleName();
private RecyclerView recyclerView;
private List<Feature> featureList;
private DataAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG,"onCreate() method called...");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_earthquke);
recyclerView = findViewById(R.id.earthquake_recycler_view);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
okHttpClientBuilder.addInterceptor(loggingInterceptor);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://earthquake.usgs.gov/")
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClientBuilder.build())
.build();
EarthquakeRequestInterface requestInterface = retrofit.create(EarthquakeRequestInterface.class);
Call<EarthquakeResponse> responseCall =requestInterface.getJSON("geojson");
responseCall.enqueue(new Callback<EarthquakeResponse>() {
@Override
public void onResponse(Call<EarthquakeResponse> call, Response<EarthquakeResponse> response) {
if (response.isSuccessful()){
EarthquakeResponse earthquakeResponse = response.body();
adapter = new DataAdapter(earthquakeResponse.getFeatures());
recyclerView.setAdapter(adapter);
}
else {
Toast.makeText(getApplicationContext(),"No data Found",Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<EarthquakeResponse> call, Throwable t) {
Log.e("Error",t.getMessage());
}
});
}
}`
Это мой класс адаптера.
public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
private List<Feature> features;
public DataAdapter(List<Feature> features1) {
this.features = features1;
}
@NonNull
@Override
public DataAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.earthquake_item, viewGroup, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull DataAdapter.ViewHolder viewHolder, int i) {
viewHolder.earthquakeMag.setText(features.get(i).getProperties().getMag().toString());
viewHolder.earthquakePlace.setText(features.get(i).getProperties().getPlace());
viewHolder.earthquakeUrl.setText(features.get(i).getProperties().getUrl());
}
@Override
public int getItemCount() {
return features.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
private TextView earthquakeMag,earthquakePlace,earthquakeUrl;
public ViewHolder(View view) {
super(view);
earthquakeMag = view.findViewById(R.id.earthquake_mag);
earthquakePlace = view.findViewById(R.id.earthquake_place);
earthquakeUrl = view.findViewById(R.id.earthquake_url);
}
}
}
Это мой интерфейс API.
public interface EarthquakeRequestInterface {
@GET ("fdsnws/event/1/query")
Call<EarthquakeResponse> getJSON(@Query("format") String format);
}
Это мой класс Java Response (POJO или класс Model).
public class EarthquakeResponse {
@SerializedName("type")
@Expose
private String type;
@SerializedName("metadata")
@Expose
private Metadata metadata;
@SerializedName("features")
@Expose
private List<Feature> features = null;
@SerializedName("bbox")
@Expose
private List<Double> bbox = null;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Metadata getMetadata() {
return metadata;
}
public void setMetadata(Metadata metadata) {
this.metadata = metadata;
}
public List<Feature> getFeatures() {
return features;
}
public void setFeatures(List<Feature> features) {
this.features = features;
}
public List<Double> getBbox() {
return bbox;
}
public void setBbox(List<Double> bbox) {
this.bbox = bbox;
}
}
Это мой класс объектов (класс POJO)
public class Feature {
@SerializedName("type")
@Expose
private String type;
@SerializedName("properties")
@Expose
private Properties properties;
@SerializedName("geometry")
@Expose
private Geometry geometry;
@SerializedName("id")
@Expose
private String id;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public Geometry getGeometry() {
return geometry;
}
public void setGeometry(Geometry geometry) {
this.geometry = geometry;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
Это класс свойств Java (класс POJO). Он содержит данные, которые меня интересуют. Я уменьшаю их до 3, чтобы проверить, работает мой код или нет.
public class Properties {
@SerializedName("mag")
@Expose
private Double mag;
@SerializedName("place")
@Expose
private String place;
@SerializedName("url")
@Expose
private String url;
@SerializedName("detail")
@Expose
private String detail;
public Double getMag() {
return mag;
}
public void setMag(Double mag) {
this.mag = mag;
}
public String getPlace() {
return place;
}
public void setPlace(String place) {
this.place = place;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDetail() {
return detail;
}
}
Существуют другие классы POJO, такие как Geometry, Metadata, которые присутствуют в ответе JSON, но я не заинтересован в этом.
Это моя деятельность_основная.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- Layout for a list of earthquakes -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/earthquake_recycler_view"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</android.support.v7.widget.RecyclerView>
</LinearLayout>
Это мой собственный файл макета адаптера.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/earthquake_layout"
android:orientation="vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingBottom="16dp"
android:paddingTop="16dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/earthquake_mag"
android:layout_gravity="top"
android:textStyle="bold"
android:textSize="16sp"
android:textColor="@android:color/black"
android:paddingLeft="10dp"
android:paddingRight="10dp"
tools:text="Place"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/earthquake_place"
android:layout_gravity="top"
android:textStyle="bold"
android:textSize="16sp"
android:textColor="@android:color/black"
android:paddingLeft="10dp"
android:paddingRight="10dp"
tools:text="Place"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/earthquake_url"
android:layout_gravity="top"
android:textStyle="bold"
android:textSize="16sp"
android:textColor="@android:color/black"
android:paddingLeft="10dp"
android:paddingRight="10dp"
tools:text="Place"
/>
</LinearLayout>
Извините за мой плохой английский или любой неправильный способ задать вопрос. Я новичок в stackoverflow. Я недавно зарегистрировался.
Пожалуйста, действительно нужна серьезная помощь, чтобы преодолеть это.