我正在使用翻新的Restful API,我想要的数据有很多对象,所以我决定使用RecyclerView
,因为它的功能更强大,更灵活,但这是我第一次使用自定义的{{1 }},我不知道这是否是使用它的正确方法,但我的应用程序却无法启动!
Allcountries.java
RecyclerView
DetailAdapter.java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.widget.TextView;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.common.GooglePlayServicesRepairableException;
import com.google.android.gms.security.ProviderInstaller;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import javax.net.ssl.SSLContext;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class Allcountries extends AppCompatActivity {
RecyclerView recyclerView;
TextView textViewResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_allcountries);
try {
ProviderInstaller.installIfNeeded(getApplicationContext());
SSLContext sslContext;
sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, null, null);
sslContext.createSSLEngine();
} catch (GooglePlayServicesRepairableException | GooglePlayServicesNotAvailableException
| NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
}
textViewResult = findViewById(R.id.countryname);
recyclerView = findViewById(R.id.rv);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://siteweb/")
.addConverterFactory(GsonConverterFactory.create())
.build();
CoronaLmaoNinjaCountries coronaLmaoNinjaCountries = retrofit.create(CoronaLmaoNinjaCountries.class);
Call<List<Detail>> call = coronaLmaoNinjaCountries.getPosts();
call.enqueue(new Callback<List<Detail>>() {
@Override
public void onResponse(Call<List<Detail>> call, Response<List<Detail>> response) {
if (!response.isSuccessful()) {
textViewResult.setText("Code: " + response.code());
return;
}
List<Detail> details = response.body();
DetailAdapter detailAdapter = new DetailAdapter(Allcountries.this,details);
recyclerView.setAdapter(detailAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(Allcountries.this));
}
@Override
public void onFailure(Call<List<Detail>> call, Throwable t) {
textViewResult.setText(t.getMessage());
}
});
}}
Detail.java
import android.content.Context;
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 java.util.List;
public class DetailAdapter extends RecyclerView.Adapter<DetailAdapter.MyViewHolder>{
List<Detail> countries;
Context ct;
public DetailAdapter(Context ct,List<Detail> countries) {
this.countries = countries;
this.ct=ct;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(ct);
View view = inflater.inflate(R.layout.row, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.country.setText(countries.get(position).getCountry());
holder.cases.setText(countries.get(position).getCases());
holder.recovered.setText(countries.get(position).getRecovered());
holder.deaths.setText(countries.get(position).getDeaths());
}
@Override
public int getItemCount() {
return countries.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder{
TextView country,cases,recovered,deaths;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
country = itemView.findViewById(R.id.countryname);
cases = itemView.findViewById(R.id.cases);
recovered = itemView.findViewById(R.id.recovered);
deaths = itemView.findViewById(R.id.deathsr);
}
}
}
Activity_Allcountries.xml
public class Detail {
private String country;
private int cases;
private int deaths;
private int recovered;
public String getCountry() {
return country;
}
public int getCases() {
return cases;
}
public int getDeaths() {
return deaths;
}
public int getRecovered() {
return recovered;
}
}
row.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".Allcountries">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
CoronaLmaoNinjaCountries.java
<androidx.constraintlayout.widget.ConstraintLayout 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:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/countryname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="21dp"
android:text="TextView"
app:layout_constraintBottom_toTopOf="@+id/deathsr"
tools:layout_editor_absoluteX="176dp" />
<TextView
android:id="@+id/cases"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="101dp"
android:layout_marginRight="101dp"
android:text="TextView"
app:layout_constraintEnd_toStartOf="@+id/deathsr"
tools:layout_editor_absoluteY="40dp" />
<TextView
android:id="@+id/recovered"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="101dp"
android:layout_marginLeft="101dp"
android:text="TextView"
app:layout_constraintStart_toEndOf="@+id/deathsr"
tools:layout_editor_absoluteY="40dp" />
<TextView
android:id="@+id/deathsr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
tools:layout_editor_absoluteX="176dp"
tools:layout_editor_absoluteY="40dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>``` ```
logcat错误:
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
public interface CoronaLmaoNinjaCountries {
@GET("countries")
Call<List<Detail>> getPosts();
}
答案 0 :(得分:1)
首先请确保您以正确的方式进行了JSON解析,使用@SerializedName(“ key_name”)并为其设置了密钥名称,然后确保您对recyclerView进行了正确的初始化
1- init recyclerview
RecyclerView recyclerView = findViewById(R.id.rv);
2-设置LayoutManager
recyclerView.setLayoutManager(new LinearLayoutManager(this)); //(Required)
3-创建适配器并将其传递给recyclerview
recyclerView.setAdapter(adapter);