Нет данных с использованием RecylcerView и Retrofit2 последней - PullRequest
0 голосов
/ 16 сентября 2018

Я новичок в дооснащении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. Я недавно зарегистрировался. Пожалуйста, действительно нужна серьезная помощь, чтобы преодолеть это.

1 Ответ

0 голосов
/ 16 сентября 2018

Попробуйте установить адаптер вне метода Retrofit. Как то так:

    recyclerView.setHasFixedSize(true);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);
    mItems = new ArrayList<Feature>;
    adapter = new DataAdapter(mItems);
    recyclerView.setAdapter(adapter);

   // .. other code 

    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();
                mItems.addAll(earthquakeResponse.getFeatures());
                adapter.notifyDatasetChanged();

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