#java #android
#java #Android
Вопрос:
Я хочу получить список массивов пользователей. У меня есть три класса POGO, т.е. Root(родительский класс), ContactFamilyDetails(дочерний класс), DataModelFamilyDetails (класс внуков).
Проблема, с которой я сталкивался все время, заключается в том, что при запуске приложения в то время я получаю только первое значение массива, к сожалению, я не получил остальные значения. Итак, я собираюсь поделиться всем своим кодом, поэтому, пожалуйста, просмотрите его и помогите мне в этом!! Спасибо!!
AddUserActivity (действует как MainActivity)
public class AddUserActivity extends AppCompatActivity {
SharedPreferences prefs;
String FirstName;
String ContactNo,Authentication,ID;
FloatingActionButton FAB;
private DataModelFamilyDetails dataModelFamDetails;
ArrayList<DataModelFamilyDetails> dataModelFamilyDetails;
RecyclerViewAdapter adapter;
RecyclerView myrv;
Context context;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_user);
// Initialize FloatingAction button
FAB=findViewById(R.id.fab_id);
//SharedPreference Login details
prefs = this.getSharedPreferences("logindata", MODE_PRIVATE);
FirstName = prefs.getString("fname", "");
ContactNo = prefs.getString("contact_no1", "");
Authentication=prefs.getString("Authentication","");
ID=prefs.getString("id","");
//Setting RecyclerView
myrv = findViewById(R.id.recyclerview_id);
LinearLayoutManager mLayoutManager = new LinearLayoutManager(AddUserActivity.this);
myrv.setLayoutManager(mLayoutManager);
dataModelFamilyDetails=new ArrayList<DataModelFamilyDetails>();
//Set Click listener on Floating Action Button
FAB.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view) {
Intent intent=new Intent(AddUserActivity.this,AddNewUserActivity.class);
startActivity(intent);
}
});
//Call the Retrofit Class data
getResult1();
}
//Fetching Family Details using Retrofit
private void getResult1()
{
RequestBody requestBody=new FormBody.Builder()
.add("id",ID)
.add("Authentication",Authentication)
.build();
//Below, API call by a Retrofit Class to the java Interface
try
{
Retrofit_Class.getDefault().apiInterface().getFamilyDetails(requestBody).enqueue(new Callback<Root<ContactFamilyDetails>>()
{
@Override
public void onResponse(Call<Root<ContactFamilyDetails>> call, retrofit2.Response<Root<ContactFamilyDetails>> response)
{
ContactFamilyDetails contactFamilyDetails=response.body().getRoot();
String Status=contactFamilyDetails.getStatus();
if(Status.equals("true"))
{
dataModelFamilyDetails=contactFamilyDetails.getData();
myrv.setAdapter(new RecyclerViewAdapter(getApplicationContext(),dataModelFamilyDetails));
RecyclerViewAdapter(getApplicationContext(),dataModelFamilyDetails);
}else
{
Toast.makeText(context, "You haven't added any family member yet !!", Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<Root<ContactFamilyDetails>> call, Throwable t)
{
Log.d("Error",t.getMessage());
Toast.makeText(context, "Error fetching data", Toast.LENGTH_SHORT).show();
}
});
}catch (Exception e)
{
Log.d("Error",e.getMessage());
Toast.makeText(context, e.toString(), Toast.LENGTH_SHORT).show();
}
}
}
Класс RecyclerViewAdapter
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder>{
ArrayList<DataModelFamilyDetails> dataModelFamilyDetails=new ArrayList<DataModelFamilyDetails>();
Context mContext;
public RecyclerViewAdapter(Context mContext, ArrayList<DataModelFamilyDetails> dataModelFamilyDetails) {
this.mContext=mContext;
this.dataModelFamilyDetails=dataModelFamilyDetails;
}
//3 Implemented methods of RecyclerView.Adapter
@NonNull
@Override
public RecyclerViewAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
{
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_user_details, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder( RecyclerViewAdapter.MyViewHolder holder, int position)
{
holder.Name.setText(dataModelFamilyDetails.get(position).getName());
holder.Contact.setText(dataModelFamilyDetails.get(position).getContact_no());
}
@Override
public int getItemCount()
{
return dataModelFamilyDetails.size();
}
//Inner Class of RecyclerViewAdapter
public static class MyViewHolder extends RecyclerView.ViewHolder
{
TextView Name,Download,Contact;
ImageView DeleteDustbin,Call;
CardView cardView;
public MyViewHolder(View itemView) {
super(itemView);
//Initialize the variables
Name=itemView.findViewById(R.id.tv1_id);
Download=itemView.findViewById(R.id.tv2_id);
Contact=itemView.findViewById(R.id.tv_contact_id);
cardView=itemView.findViewById(R.id.cardview_id);
DeleteDustbin=itemView.findViewById(R.id.delete_img_id);
Call=itemView.findViewById(R.id.call_img_id);
}
}
}
Root (класс POGO (родительский класс))
public class Root<T> {
private T root;
public T getRoot()
{
return root;
}
}
ContactFamilyDetails (POGO Class(Child class))
public class ContactFamilyDetails {
@SerializedName("status")
private String Status;
@SerializedName("message")
private String Message;
@SerializedName("data")
private ArrayList<DataModelFamilyDetails> data;
public String getStatus() {
return Status;
}
public String getMessage() {
return Message;
}
public ArrayList<DataModelFamilyDetails> getData() {
return data;
}
}
DataModelFamilyDetails (POGO Class (GrandChild class))
public class DataModelFamilyDetails {
@SerializedName("id")
private String id;
@SerializedName("parentId")
private String parentId;
@SerializedName("name")
private String name;
@SerializedName("age")
private String age;
@SerializedName("sex")
private String sex;
@SerializedName("relation")
private String relation;
@SerializedName("contact_no")
private String contact_no;
@SerializedName("email")
private String email;
@SerializedName("description")
private String description;
@SerializedName("status")
private String status;
@SerializedName("image")
private String image;
@SerializedName("regDateTime")
private String regDateTime;
public DataModelFamilyDetails(String name, String contact_no) {
this.name = name;
this.contact_no = contact_no;
}
public String getId() {
return id;
}
public String getParentId() {
return parentId;
}
public String getName() {
return name;
}
public String getAge() {
return age;
}
public String getSex() {
return sex;
}
public String getRelation() {
return relation;
}
public String getContact_no() {
return contact_no;
}
public String getEmail() {
return email;
}
public String getDescription() {
return description;
}
public String getStatus() {
return status;
}
public String getImage() {
return image;
}
public String getRegDateTime() {
return regDateTime;
}
}
Модифицированный класс
public class Retrofit_Class {
//set an Url here
public static final String API_BASE_URL = "http://www.hawktechnologies.in/society-management/appservices/";
//Create a reference of the class here
private static Retrofit_Class mInstance;
//Object creation of Retrofit.builder
private static Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create(Retrofit_Class.getDefault().getGsonParser()));
private ApiInterface apiInterface;
private OkHttpClient okHttpClient;
private Gson gson;
//Constructor
private Retrofit_Class() {
//No External Instances
}
public static <S> S createService(Class<S> serviceClass) {
Retrofit retrofit = builder.client(Retrofit_Class.getDefault().getOkHttpClient()).build();
return retrofit.create(serviceClass);
}
//Retrofit class method
public static Retrofit_Class getDefault() {
if (mInstance == null) {
mInstance = new Retrofit_Class();
}
return mInstance;
}
//Interface class method
public ApiInterface apiInterface() {
if (apiInterface == null) {
apiInterface = createService(ApiInterface.class);
}
return apiInterface;
}
//Method type Gson
public Gson getGsonParser() {
if (gson == null) {
gson = new Gson();
}
return gson;
}
//Use of HTTP
public OkHttpClient getOkHttpClient() {
if (okHttpClient == null) {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Timber.tag("OkHttp").d(message);
}
});
if (BuildConfig.DEBUG) {
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
} else {
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.NONE);
}
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.addInterceptor(loggingInterceptor)
.build();
}
return okHttpClient;
}
}
Интерфейс
public interface ApiInterface
{
@POST("user-login.php")
Call<Root<Contact>> getLogin(@Body RequestBody requestBody);
@POST("get_familymembers.php")
Call<Root<ContactFamilyDetails>> getFamilyDetails(@Body RequestBody requestBody);
}
Вместо получения 4 результатов я получаю только один, пожалуйста, нажмите на ссылку, чтобы увидеть картинку.
Ссылка на изображение
Комментарии:
1. вы пытались отлаживать и проверять, возвращает ли api правильные значения?
2. Классы POJO упакованы в типизированный модифицированный класс вызова. Чтобы создать класс POJO для каждого ответа, мы можем перейти к jsonschema2pojo.org
3. @KaranMer Да, все значения возвращаются во время отладки.