How to Extract Data from JSON Array in Android using Retrofit Library?
In the previous article on JSON Parsing in Android using Retrofit Library, we have seen how we can get the data from JSON Object in our android app and display that JSON Object in our app. In this article, we will take a look at How to extract data from JSON Array and display that in our app.
Note: To extract Data from JSON Array in Android using Volley Library please refer to How to Extract Data from JSON Array in Android using Volley Library?
JSON Array: JSON Array is a set or called a collection of data that holds multiple JSON Objects with similar sort of data. JSON Array can be easily identified with “[” braces opening and “]” braces closing. A JSON array is having multiple JSON objects which are having similar data. And each JSON object is having data stored in the form of key and value pair.
What we are going to build in this article?
We will be building a simple application in which we will be displaying a list of CardView in which we will display some courses which are available on Geeks for Geeks. A sample video is given below to get an idea about what we are going to do in this article. Note that we are going to implement this project using the Java language.
Below is our JSON array from which we will be displaying the data in our Android App.
[
{
"courseName":"Fork CPP",
"courseimg":"https://media.geeksforgeeks.org/img-practice/banner/fork-cpp-thumbnail.png",
"courseMode":"Online Batch",
"courseTracks":"6 Tracks"
},
{
"courseName":"Linux & Shell Scripting Foundation",
"courseimg":"https://media.geeksforgeeks.org/img-practice/banner/linux-shell-scripting-thumbnail.png",
"courseMode":"Online Batch",
"courseTracks":"8 Tracks"
},
{
"courseName":"11 Weeks Workshop on Data Structures and Algorithms",
"courseimg":"https://media.geeksforgeeks.org/img-practice/banner/Workshop-DSA-thumbnail.png",
"courseMode":"Online Batch",
"courseTracks":"47 Tracks"
},
{
"courseName":"Data Structures and Algorithms",
"courseimg":"https://media.geeksforgeeks.org/img-practice/banner/dsa-self-paced-thumbnail.png",
"courseMode":"Online Batch",
"courseTracks":"24 Tracks"
}
]
Step by Step Implementation
Step 1: Create a New Project
To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio. Note that select Java as the programming language.
Step 2: Add the below dependency in your build.gradle file
Below is the dependency for Volley which we will be using to get the data from API. For adding this dependency navigate to the app > Gradle Scripts > build.gradle(app) and add the below dependency in the dependencies section. We have used the Picasso dependency for image loading from the URL.
// below dependency for using retrofit.
implementation ‘com.squareup.retrofit2:retrofit:2.9.0’
implementation ‘com.squareup.retrofit2:converter-gson:2.5.0’
// below dependency for using picasso image loading library
implementation ‘com.squareup.picasso:picasso:2.71828’
After adding this dependency sync your project and now move towards the AndroidManifest.xml part.
Step 3: Adding permissions to the internet in the AndroidManifest.xml file
Navigate to the app > AndroidManifest.xml and add the below code to it.
XML
< uses-permission android:name = "android.permission.INTERNET" />
|
Step 4: Working with the activity_main.xml file
Navigate to the app > res > layout > activity_main.xml and add the below code to that file. Below is the code for the activity_main.xml file.
XML
<? xml version = "1.0" encoding = "utf-8" ?>
< RelativeLayout
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:layout_gravity = "center"
android:gravity = "center"
android:orientation = "vertical"
tools:context = ".MainActivity" >
< ProgressBar
android:id = "@+id/idPBLoading"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_centerInParent = "true" />
< androidx.recyclerview.widget.RecyclerView
android:id = "@+id/idRVCourse"
android:layout_width = "match_parent"
android:layout_height = "match_parent" />
</ RelativeLayout >
|
Step 5: Creating a modal class for storing our data
Navigate to the app > java > your app’s package name > Right-click on it > New > Java class and name it as RecyclerData and add the below code to it. Comments are added inside the code to understand the code in more detail.
Java
public class RecyclerData {
private String courseName;
private String courseimg;
private String courseMode;
private String courseTracks;
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this .courseName = courseName;
}
public String getCourseimg() {
return courseimg;
}
public void setCourseimg(String courseimg) {
this .courseimg = courseimg;
}
public String getCourseMode() {
return courseMode;
}
public void setCourseMode(String courseMode) {
this .courseMode = courseMode;
}
public String getCourseTracks() {
return courseTracks;
}
public void setCourseTracks(String courseTracks) {
this .courseTracks = courseTracks;
}
public RecyclerData(String courseName, String courseimg, String courseMode, String courseTracks) {
this .courseName = courseName;
this .courseimg = courseimg;
this .courseMode = courseMode;
this .courseTracks = courseTracks;
}
}
|
Step 6: Creating a layout file for each item of our RecyclerView
Navigate to the app > res > layout > Right-click on it > New > layout resource file and give the file name as card_layout and add the below code to it.
XML
<? xml version = "1.0" encoding = "utf-8" ?>
< androidx.cardview.widget.CardView
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_margin = "8dp"
android:elevation = "8dp"
app:cardCornerRadius = "8dp" >
< LinearLayout
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:orientation = "vertical" >
< ImageView
android:id = "@+id/idIVCourse"
android:layout_width = "match_parent"
android:layout_height = "300dp"
android:layout_margin = "5dp" />
< TextView
android:id = "@+id/idTVCourseName"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_margin = "5dp"
android:padding = "5dp"
android:text = "Course Name "
android:textColor = "@color/black"
android:textSize = "18sp"
android:textStyle = "bold" />
< LinearLayout
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_margin = "5dp"
android:orientation = "horizontal"
android:weightSum = "2" >
< TextView
android:id = "@+id/idTVBatch"
android:layout_width = "0dp"
android:layout_height = "wrap_content"
android:layout_weight = "1"
android:padding = "5dp"
android:text = "Batch"
android:textColor = "@color/black" />
< TextView
android:id = "@+id/idTVTracks"
android:layout_width = "0dp"
android:layout_height = "wrap_content"
android:layout_weight = "1"
android:padding = "5dp"
android:text = "Tracks"
android:textColor = "@color/black" />
</ LinearLayout >
</ LinearLayout >
</ androidx.cardview.widget.CardView >
|
Step 7: Creating an Adapter class for setting data to our RecyclerView item
For creating a new Adapter class navigate to the app > java > your app’s package name > Right-click on it > New > Java class and name it as RecyclerViewAdapter and add the below code to it.
Java
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolder> {
private ArrayList<RecyclerData> courseDataArrayList;
private Context mcontext;
public RecyclerViewAdapter(ArrayList<RecyclerData> recyclerDataArrayList, Context mcontext) {
this .courseDataArrayList = recyclerDataArrayList;
this .mcontext = mcontext;
}
@NonNull
@Override
public RecyclerViewHolder onCreateViewHolder( @NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_layout, parent, false );
return new RecyclerViewHolder(view);
}
@Override
public void onBindViewHolder( @NonNull RecyclerViewHolder holder, int position) {
RecyclerData modal = courseDataArrayList.get(position);
holder.courseNameTV.setText(modal.getCourseName());
holder.courseTracksTV.setText(modal.getCourseTracks());
holder.courseModeTV.setText(modal.getCourseMode());
Picasso.get().load(modal.getCourseimg()).into(holder.courseIV);
}
@Override
public int getItemCount() {
return courseDataArrayList.size();
}
public class RecyclerViewHolder extends RecyclerView.ViewHolder {
private TextView courseNameTV, courseModeTV, courseTracksTV;
private ImageView courseIV;
public RecyclerViewHolder( @NonNull View itemView) {
super (itemView);
courseNameTV = itemView.findViewById(R.id.idTVCourseName);
courseModeTV = itemView.findViewById(R.id.idTVBatch);
courseTracksTV = itemView.findViewById(R.id.idTVTracks);
courseIV = itemView.findViewById(R.id.idIVCourse);
}
}
}
|
Step 8: Creating an interface class for writing our API calls
Navigate to the app > java > your app’s package name > Right-click on it > New > Java class select it as Interface and name the file as RetrofitAPI and add below code to it. Comments are added inside the code to understand the code in more detail.
Java
import java.util.ArrayList;
import retrofit2.Call;
import retrofit2.http.GET;
public interface RetrofitAPI {
@GET ( "WO6S" )
Call<ArrayList<RecyclerData>> getAllCourses();
}
|
Step 9: Working with the MainActivity.java file
Go to the MainActivity.java file and refer to the following code. Below is the code for the MainActivity.java file. Comments are added inside the code to understand the code in more detail.
Java
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
private RecyclerView courseRV;
private ArrayList<RecyclerData> recyclerDataArrayList;
private RecyclerViewAdapter recyclerViewAdapter;
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
courseRV = findViewById(R.id.idRVCourse);
progressBar = findViewById(R.id.idPBLoading);
recyclerDataArrayList = new ArrayList<>();
getAllCourses();
}
private void getAllCourses() {
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.build();
RetrofitAPI retrofitAPI = retrofit.create(RetrofitAPI. class );
Call<ArrayList<RecyclerData>> call = retrofitAPI.getAllCourses();
call.enqueue( new Callback<ArrayList<RecyclerData>>() {
@Override
public void onResponse(Call<ArrayList<RecyclerData>> call, Response<ArrayList<RecyclerData>> response) {
if (response.isSuccessful()) {
progressBar.setVisibility(View.GONE);
recyclerDataArrayList = response.body();
for ( int i = 0 ; i < recyclerDataArrayList.size(); i++) {
recyclerViewAdapter = new RecyclerViewAdapter(recyclerDataArrayList, MainActivity. this );
LinearLayoutManager manager = new LinearLayoutManager(MainActivity. this );
courseRV.setLayoutManager(manager);
courseRV.setAdapter(recyclerViewAdapter);
}
}
}
@Override
public void onFailure(Call<ArrayList<RecyclerData>> call, Throwable t) {
Toast.makeText(MainActivity. this , "Fail to get data" , Toast.LENGTH_SHORT).show();
}
});
}
}
|
Now run your app and see the output of the app.
Output:
Last Updated :
08 Dec, 2021
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...