Saher Ikram
Saher Ikram

Reputation: 3

App crashes on attaching fetched data from Retrofit to adapter

I am working with Retrofit. I followed a tutorial and did exactly what he said. Response is working perfectly in a single TextView but not in RecyclerView. When I added an adapter class, it start crashing. I read logcat file too but didn't seem helpful. The app crashes without showing any error or exception.

Here is my main XML class with a RecyclerView.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".MainActivity"
    android:orientation="vertical">


<!--    <ScrollView-->
<!--        android:layout_width="match_parent"-->
<!--        android:layout_height="match_parent">-->
<!--        <TextView-->
<!--            android:layout_width="match_parent"-->
<!--            android:layout_height="wrap_content"-->
<!--            android:id="@+id/text1"-->
<!--            android:layout_marginTop="5dp"-->
<!--            android:layout_marginStart="2dp">-->

<!--        </TextView>-->

<!--    </ScrollView>-->


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">


    </androidx.recyclerview.widget.RecyclerView>


</LinearLayout>

My main class is working fine with a for loop to print data in one TextView but not for adapter or RecyclerView.

package com.example.apipractice;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;

public class MainActivity extends AppCompatActivity {
     apiInterface instanceforAPI;
     LinearLayoutManager linearLayoutManager;
 //TextView txt;
     RecyclerView recview;
    adapter ad;
    List<jsonData> data = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 //txt = findViewById(R.id.text1);
        recview = findViewById(R.id.recview);
        linearLayoutManager = new LinearLayoutManager(this);
        recview.setLayoutManager(linearLayoutManager);

        instanceforAPI = retrofitInstance.getRetrofit().create(apiInterface.class);
        instanceforAPI.getdata().enqueue(new Callback<List<jsonData>>() {
            @Override
            public void onResponse(Call<List<jsonData>> call, Response<List<jsonData>> response) {
                if(response.body().size()>0){
                    Toast.makeText(MainActivity.this,"yayy",Toast.LENGTH_LONG).show();
                    data.addAll(response.body());

                    ad = new adapter(data);
                    ad.notifyDataSetChanged();
                    recview.setAdapter(ad);
//                        for (int index=0;index<data.size();index++){
//                  txt.setText(txt.getText()+ " SRNo.: "+data.get(index).getTitle()+" \n" + data.size());
//
//                  }

                }
                else
                {
                    Toast.makeText(MainActivity.this,"No yayy",Toast.LENGTH_LONG).show();
                }


            }

            @Override
            public void onFailure(Call<List<jsonData>> call, Throwable t) {
                Toast.makeText(MainActivity.this,t.getMessage(),Toast.LENGTH_LONG).show();
            }
        });


    }
}

SingleRow design XML class (single.xml) is as follows:

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:rotationX="8">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/t1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Name"

            ></TextView>

        <TextView
            android:id="@+id/t2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="title"

            ></TextView>


    </LinearLayout>

</com.google.android.material.card.MaterialCardView>

Adapter class (adapter.java) for fetching data is as follows:

package com.example.apipractice;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class adapter extends RecyclerView.Adapter<adapter.myviewholder> {

    List<jsonData> data;

    public  adapter(List<jsonData> data){
        this.data = data;
    }
    @Override
    public myviewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.single,parent,false    );
    return new myviewholder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull adapter.myviewholder holder, int position) {
         holder.t1.setText((int) data.get(position).getId());
        holder.t2.setText( data.get(position).getTitle());

    }

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

    public class myviewholder extends RecyclerView.ViewHolder
    {
        TextView t1,t2;


        public myviewholder(@NonNull View itemView) {
            super(itemView);
            t1= itemView.findViewById(R.id.t1);
            t2 = itemView.findViewById(R.id.t2);
        }

    }
}

The following class is for retrofit instance, retrofitInstance.java:


package com.example.apipractice;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class retrofitInstance {

    private static Retrofit retrofit;
    private  static final String commonURL = "https://jsonplaceholder.typicode.com";

    public static Retrofit getRetrofit() {
        if(retrofit ==null) {
            retrofit = new Retrofit.Builder().baseUrl(commonURL).addConverterFactory(GsonConverterFactory.create()).build();
        }
        return retrofit;
    }
}

This interface class (apiInterfce.java) is for the API get call:



package com.example.apipractice;

import java.util.List;

import retrofit2.Call;
import retrofit2.http.GET;

public interface apiInterface {
    @GET("/posts?type=json")
    Call<List<jsonData>> getdata();
}

My model class, jsonData.java:

package com.example.apipractice;

public class jsonData {

    private float userId;
    private float id;
    private String title;
    private String body;


    // Getter Methods

    public float getUserId() {
        return userId;
    }

    public float getId() {
        return id;
    }

    public String getTitle() {
        return title;
    }

    public String getBody() {
        return body;
    }

    // Setter Methods

    public void setUserId(float userId) {
        this.userId = userId;
    }

    public void setId(float id) {
        this.id = id;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setBody(String body) {
        this.body = body;
    }
}

Upvotes: 0

Views: 181

Answers (1)

Shivam Jamaiwar
Shivam Jamaiwar

Reputation: 544

Don't pass int value in setText() method. Because it consider int value as a resource id.

Please do as follow:

@Override
public void onBindViewHolder(@NonNull adapter.myviewholder holder, int position) {
         holder.t1.setText(data.get(position).getId() + "");
         holder.t2.setText( data.get(position).getTitle());
}

Upvotes: 1

Related Questions