How to Build a Book Library App using Google Books API in Android? - GeeksforGeeks

21 Jan, 2021
If you are looking for building a book library app and you want to load a huge data of books then for adding this feature, you have to use a simple API which is provided by Google, and of course, it’s free. In this article, we will take a look at the implementation of this API in our Android App. 
We will be building a simple application in which we will be searching different types of books and we will get to see the list of books related to that topic in our RecyclerView. For searching these books we will be using a free API provided by Google which holds a huge collection of books. 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. 
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 dependency for Volley in your Gradle files
Navigate to the app > Gradle Scripts > build.gradle file and add below dependency in the dependencies section. 
implementation ‘com.android.volley:volley:1.1.1’
implementation ‘com.squareup.picasso:picasso:2.71828’ 
After adding the below dependencies in your gradle file now sync your project and now we will move towards our activity_main.xml file. As we will be using volley to fetch data from our API and Picasso image loading library to load images from URL.   
Step 3: Adding permissions for the Internet 
Navigate to the app > AndroidManifest.xml and add the below permissions to it. 
XML
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
As we will be loading the books from API so we have to request Internet permissions from the user. For that add the permissions for the internet in AndroidManifest.xml. 
Step 4: Working with the activity_main.xml file
Go to the activity_main.xml file and refer to the following code. Below is the code for the activity_main.xml file.
XML
<?xml version="1.0" encoding="utf-8"?><RelativeLayout     xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity">      <LinearLayout        android:id="@+id/idLLsearch"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal"        android:weightSum="5">          <!--edit text for getting the search             query for book from user-->        <EditText            android:id="@+id/idEdtSearchBooks"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="4" />          <!--image button for our search button -->        <ImageButton            android:id="@+id/idBtnSearch"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:src="@drawable/ic_search" />      </LinearLayout>      <!--recycler view for displaying our list of books-->    <androidx.recyclerview.widget.RecyclerView        android:id="@+id/idRVBooks"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_below="@id/idLLsearch" />      <!--progressbar for displaying our loading indicator-->    <ProgressBar        android:id="@+id/idLoadingPB"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerInParent="true"        android:visibility="gone" />      </RelativeLayout>
Step 5: Creating a Modal Class for storing our data from the API. 
For creating a new Modal class. Navigate to the app > java > your app’s package name > Right-click on it and Click on New > Java class and give a name to our java class as BookInfo and add below code to it. Comments are added in the code to get to know in more detail. 
Java
import java.util.ArrayList;  public class BookInfo {      // creating string, int and array list     // variables for our book details    private String title;    private String subtitle;    private ArrayList<String> authors;    private String publisher;    private String publishedDate;    private String description;    private int pageCount;    private String thumbnail;    private String previewLink;    private String infoLink;    private String buyLink;      // creating getter and setter methods    public String getTitle() {        return title;    }      public void setTitle(String title) {        this.title = title;    }      public String getSubtitle() {        return subtitle;    }      public void setSubtitle(String subtitle) {        this.subtitle = subtitle;    }      public ArrayList<String> getAuthors() {        return authors;    }      public void setAuthors(ArrayList<String> authors) {        this.authors = authors;    }      public String getPublisher() {        return publisher;    }      public void setPublisher(String publisher) {        this.publisher = publisher;    }      public String getPublishedDate() {        return publishedDate;    }      public void setPublishedDate(String publishedDate) {        this.publishedDate = publishedDate;    }      public String getDescription() {        return description;    }      public void setDescription(String description) {        this.description = description;    }      public int getPageCount() {        return pageCount;    }      public void setPageCount(int pageCount) {        this.pageCount = pageCount;    }          public String getThumbnail() {        return thumbnail;    }      public void setThumbnail(String thumbnail) {        this.thumbnail = thumbnail;    }      public String getPreviewLink() {        return previewLink;    }      public void setPreviewLink(String previewLink) {        this.previewLink = previewLink;    }      public String getInfoLink() {        return infoLink;    }      public void setInfoLink(String infoLink) {        this.infoLink = infoLink;    }      public String getBuyLink() {        return buyLink;    }      public void setBuyLink(String buyLink) {        this.buyLink = buyLink;    }      // creating a constructor class for our BookInfo    public BookInfo(String title, String subtitle, ArrayList<String> authors, String publisher,                    String publishedDate, String description, int pageCount, String thumbnail,                     String previewLink, String infoLink, String buyLink) {        this.title = title;        this.subtitle = subtitle;        this.authors = authors;        this.publisher = publisher;        this.publishedDate = publishedDate;        this.description = description;        this.pageCount = pageCount;        this.thumbnail = thumbnail;        this.previewLink = previewLink;        this.infoLink = infoLink;        this.buyLink = buyLink;    }}
Step 6: Create a new layout resource file
Go to the app > res > layout > right-click > New > Layout Resource File and name the file as book_rv_item and add the following code to this file.
XML
<?xml version="1.0" encoding="utf-8"?><androidx.cardview.widget.CardView     xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_margin="4dp"    app:cardCornerRadius="8dp"    app:cardElevation="8dp">      <RelativeLayout        android:layout_width="match_parent"        android:layout_height="wrap_content">          <ImageView            android:id="@+id/idIVbook"            android:layout_width="130dp"            android:layout_height="160dp"            android:layout_margin="10dp" />          <TextView            android:id="@+id/idTVBookTitle"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginTop="10dp"            android:layout_toEndOf="@id/idIVbook"            android:padding="3dp"            android:text="Book Title"            android:textColor="@color/black"            android:textSize="11sp" />          <TextView            android:id="@+id/idTVpublisher"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_below="@id/idTVBookTitle"            android:layout_marginTop="3dp"            android:layout_toEndOf="@id/idIVbook"            android:padding="3dp"            android:text="Publisher"            android:textColor="@color/black"            android:textSize="11sp" />          <TextView            android:id="@+id/idTVPageCount"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_below="@id/idTVpublisher"            android:layout_marginTop="3dp"            android:layout_toEndOf="@id/idIVbook"            android:padding="3dp"            android:text="Page count"            android:textColor="@color/black"            android:textSize="11sp" />          <TextView            android:id="@+id/idTVDate"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_below="@id/idTVPageCount"            android:layout_alignParentEnd="true"            android:layout_marginEnd="5dp"            android:padding="3dp"            android:text="date"            android:textColor="@color/black"            android:textSize="11sp" />              </RelativeLayout>      </androidx.cardview.widget.CardView>
Step 7: Creating an Adapter class for setting our data to the item of RecyclerView
Navigate to the app > java > your app’s package name > Right-click on it Click on New > Java class and name it as BookAdapter and add below code to it. Comments are added in the code to get to know in more detail. 
Java
import android.content.Context;import android.content.Intent;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 BookAdapter extends RecyclerView.Adapter<BookAdapter.BookViewHolder> {      // creating variables for arraylist and context.    private ArrayList<BookInfo> bookInfoArrayList;    private Context mcontext;      // creating constructor for array list and context.    public BookAdapter(ArrayList<BookInfo> bookInfoArrayList, Context mcontext) {        this.bookInfoArrayList = bookInfoArrayList;        this.mcontext = mcontext;    }          @NonNull    @Override    public BookViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {        // inflating our layout for item of recycler view item.        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.book_rv_item, parent, false);        return new BookViewHolder(view);    }      @Override    public void onBindViewHolder(@NonNull BookViewHolder holder, int position) {                  // inside on bind view holder method we are         // setting ou data to each UI component.        BookInfo bookInfo = bookInfoArrayList.get(position);        holder.nameTV.setText(bookInfo.getTitle());        holder.publisherTV.setText(bookInfo.getPublisher());        holder.pageCountTV.setText("No of Pages : " + bookInfo.getPageCount());        holder.dateTV.setText(bookInfo.getPublishedDate());                  // below line is use to set image from URL in our image view.        Picasso.get().load(bookInfo.getThumbnail()).into(holder.bookIV);          // below line is use to add on click listener for our item of recycler view.        holder.itemView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // inside on click listener method we are calling a new activity                 // and passing all the data of that item in next intent.                Intent i = new Intent(mcontext, BookDetails.class);                i.putExtra("title", bookInfo.getTitle());                i.putExtra("subtitle", bookInfo.getSubtitle());                i.putExtra("authors", bookInfo.getAuthors());                i.putExtra("publisher", bookInfo.getPublisher());                i.putExtra("publishedDate", bookInfo.getPublishedDate());                i.putExtra("description", bookInfo.getDescription());                i.putExtra("pageCount", bookInfo.getPageCount());                i.putExtra("thumbnail", bookInfo.getThumbnail());                i.putExtra("previewLink", bookInfo.getPreviewLink());                i.putExtra("infoLink", bookInfo.getInfoLink());                i.putExtra("buyLink", bookInfo.getBuyLink());                                  // after passing that data we are                 // starting our new  intent.                mcontext.startActivity(i);            }        });    }          @Override    public int getItemCount() {        // inside get item count method we         // are returning the size of our array list.        return bookInfoArrayList.size();    }      public class BookViewHolder extends RecyclerView.ViewHolder {        // below line is use to initialize         // our text view and image views.        TextView nameTV, publisherTV, pageCountTV, dateTV;        ImageView bookIV;          public BookViewHolder(View itemView) {            super(itemView);            nameTV = itemView.findViewById(R.id.idTVBookTitle);            publisherTV = itemView.findViewById(R.id.idTVpublisher);            pageCountTV = itemView.findViewById(R.id.idTVPageCount);            dateTV = itemView.findViewById(R.id.idTVDate);            bookIV = itemView.findViewById(R.id.idIVbook);        }    }}
Step 8: Creating a new Activity for displaying our Book Info in detail 
Navigate to the app > java > your app’s package name > Right-click on it and click on New > Activity > Select Empty Activity and name it as BookDetails. Make sure to select Empty Activity. 
Working with the activity_book_details.xml file:
Go to the activity_book_details.xml file and refer to the following code. Below is the code for the activity_book_details.xml file.
XML
<?xml version="1.0" encoding="utf-8"?><ScrollView     xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context=".BookDetails">      <LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="vertical">          <LinearLayout            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:orientation="horizontal">              <!--Image view for displaying our book image-->            <ImageView                android:id="@+id/idIVbook"                android:layout_width="130dp"                android:layout_height="160dp"                android:layout_margin="18dp" />              <LinearLayout                android:layout_width="match_parent"                android:layout_height="wrap_content"                android:layout_marginTop="20dp"                android:orientation="vertical">                  <!--Text view for displaying book publisher-->                <TextView                    android:id="@+id/idTVpublisher"                    android:layout_width="match_parent"                    android:layout_height="wrap_content"                    android:padding="4dp"                    android:text="Publisher"                    android:textColor="@color/black"                    android:textSize="15sp" />                  <!--text view for displaying number of pages of book-->                <TextView                    android:id="@+id/idTVNoOfPages"                    android:layout_width="match_parent"                    android:layout_height="wrap_content"                    android:layout_marginTop="4dp"                    android:padding="4dp"                    android:text="Number of Pages"                    android:textColor="@color/black"                    android:textSize="15sp" />                  <!--text view for displaying book publish date-->                <TextView                    android:id="@+id/idTVPublishDate"                    android:layout_width="match_parent"                    android:layout_height="wrap_content"                    android:layout_marginTop="4dp"                    android:padding="4dp"                    android:text="Publish Date"                    android:textColor="@color/black"                    android:textSize="15sp" />              </LinearLayout>          </LinearLayout>          <!--text view for displaying book title-->        <TextView            android:id="@+id/idTVTitle"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_margin="8dp"            android:padding="4dp"            android:text="title"            android:textColor="@color/black"            android:textSize="15sp" />          <!--text view for displaying book subtitle-->        <TextView            android:id="@+id/idTVSubTitle"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_margin="8dp"            android:padding="4dp"            android:text="subtitle"            android:textColor="@color/black"            android:textSize="12sp" />          <!--text view for displaying book description-->        <TextView            android:id="@+id/idTVDescription"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_margin="8dp"            android:padding="4dp"            android:text="description"            android:textColor="@color/black"            android:textSize="12sp" />                  <LinearLayout            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_margin="8dp"            android:orientation="horizontal"            android:weightSum="2">              <!--button for displaying book preview-->            <Button                android:id="@+id/idBtnPreview"                android:layout_width="0dp"                android:layout_height="wrap_content"                android:layout_margin="4dp"                android:layout_weight="1"                android:text="Preview"                android:textAllCaps="false" />              <!--button for opening buying page of the book-->            <Button                android:id="@+id/idBtnBuy"                android:layout_width="0dp"                android:layout_height="wrap_content"                android:layout_margin="4dp"                android:layout_weight="1"                android:text="Buy"                android:textAllCaps="false" />          </LinearLayout>    </LinearLayout></ScrollView>
Working with the BookDetails.java file:
Go to the BookDetails.java file and refer to the following code. Below is the code for the BookDetails.java file. Comments are added inside the code to understand the code in more detail.
Java
import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;  import androidx.appcompat.app.AppCompatActivity;  import com.squareup.picasso.Picasso;  import java.util.ArrayList;  public class BookDetails extends AppCompatActivity {          // creating variables for strings,text view, image views and button.    String title, subtitle, publisher, publishedDate, description, thumbnail, previewLink, infoLink, buyLink;    int pageCount;    private ArrayList<String> authors;      TextView titleTV, subtitleTV, publisherTV, descTV, pageTV, publishDateTV;    Button previewBtn, buyBtn;    private ImageView bookIV;          @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_book_details);                  // initializing our views..        titleTV = findViewById(R.id.idTVTitle);        subtitleTV = findViewById(R.id.idTVSubTitle);        publisherTV = findViewById(R.id.idTVpublisher);        descTV = findViewById(R.id.idTVDescription);        pageTV = findViewById(R.id.idTVNoOfPages);        publishDateTV = findViewById(R.id.idTVPublishDate);        previewBtn = findViewById(R.id.idBtnPreview);        buyBtn = findViewById(R.id.idBtnBuy);        bookIV = findViewById(R.id.idIVbook);          // getting the data which we have passed from our adapter class.        title = getIntent().getStringExtra("title");        subtitle = getIntent().getStringExtra("subtitle");        publisher = getIntent().getStringExtra("publisher");        publishedDate = getIntent().getStringExtra("publishedDate");        description = getIntent().getStringExtra("description");        pageCount = getIntent().getIntExtra("pageCount", 0);        thumbnail = getIntent().getStringExtra("thumbnail");        previewLink = getIntent().getStringExtra("previewLink");        infoLink = getIntent().getStringExtra("infoLink");        buyLink = getIntent().getStringExtra("buyLink");          // after getting the data we are setting         // that data to our text views and image view.        titleTV.setText(title);        subtitleTV.setText(subtitle);        publisherTV.setText(publisher);        publishDateTV.setText("Published On : " + publishedDate);        descTV.setText(description);        pageTV.setText("No Of Pages : " + pageCount);        Picasso.get().load(thumbnail).into(bookIV);          // adding on click listener for our preview button.        previewBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (previewLink.isEmpty()) {                    // below toast message is displayed when preview link is not present.                    Toast.makeText(BookDetails.this, "No preview Link present", Toast.LENGTH_SHORT).show();                    return;                }                // if the link is present we are opening                 // that link via an intent.                Uri uri = Uri.parse(previewLink);                Intent i = new Intent(Intent.ACTION_VIEW, uri);                startActivity(i);            }        });          // initializing on click listener for buy button.        buyBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (buyLink.isEmpty()) {                    // below toast message is displaying when buy link is empty.                    Toast.makeText(BookDetails.this, "No buy page present for this book", Toast.LENGTH_SHORT).show();                    return;                }                // if the link is present we are opening                // the link via an intent.                Uri uri = Uri.parse(buyLink);                Intent i = new Intent(Intent.ACTION_VIEW, uri);                startActivity(i);            }        });    }}
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.EditText;import android.widget.ImageButton;import android.widget.ProgressBar;import android.widget.Toast;  import androidx.appcompat.app.AppCompatActivity;import androidx.recyclerview.widget.LinearLayoutManager;import androidx.recyclerview.widget.RecyclerView;  import com.android.volley.Request;import com.android.volley.RequestQueue;import com.android.volley.Response;import com.android.volley.VolleyError;import com.android.volley.toolbox.JsonObjectRequest;import com.android.volley.toolbox.Volley;  import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;  import java.util.ArrayList;  public class MainActivity extends AppCompatActivity {      // creating variables for our request queue,    // array list, progressbar, edittext,    // image button and our recycler view.     private RequestQueue mRequestQueue;    private ArrayList<BookInfo> bookInfoArrayList;    private ProgressBar progressBar;    private EditText searchEdt;    private ImageButton searchBtn;      @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                  // initializing our views.         progressBar = findViewById(R.id.idLoadingPB);        searchEdt = findViewById(R.id.idEdtSearchBooks);        searchBtn = findViewById(R.id.idBtnSearch);          // initializing on click listener for our button.        searchBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                progressBar.setVisibility(View.VISIBLE);                                  // checking if our edittext field is empty or not.                if (searchEdt.getText().toString().isEmpty()) {                    searchEdt.setError("Please enter search query");                    return;                }                // if the search query is not empty then we are                 // calling get book info method to load all                 // the books from the API.                getBooksInfo(searchEdt.getText().toString());            }        });    }      private void getBooksInfo(String query) {                  // creating a new array list.        bookInfoArrayList = new ArrayList<>();                  // below line is use to initialize        // the variable for our request queue.        mRequestQueue = Volley.newRequestQueue(MainActivity.this);                  // below line is use to clear cache this         // will be use when our data is being updated.        mRequestQueue.getCache().clear();                  // below is the url for getting data from API in json format.        String url = "https://www.googleapis.com/books/v1/volumes?q=" + query;                  // below line we are  creating a new request queue.        RequestQueue queue = Volley.newRequestQueue(MainActivity.this);                    // below line is use to make json object request inside that we         // are passing url, get method and getting json object. .        JsonObjectRequest booksObjrequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {            @Override            public void onResponse(JSONObject response) {                progressBar.setVisibility(View.GONE);                // inside on response method we are extracting all our json data.                try {                    JSONArray itemsArray = response.getJSONArray("items");                    for (int i = 0; i < itemsArray.length(); i++) {                        JSONObject itemsObj = itemsArray.getJSONObject(i);                        JSONObject volumeObj = itemsObj.getJSONObject("volumeInfo");                        String title = volumeObj.optString("title");                        String subtitle = volumeObj.optString("subtitle");                        JSONArray authorsArray = volumeObj.getJSONArray("authors");                        String publisher = volumeObj.optString("publisher");                        String publishedDate = volumeObj.optString("publishedDate");                        String description = volumeObj.optString("description");                        int pageCount = volumeObj.optInt("pageCount");                        JSONObject imageLinks = volumeObj.optJSONObject("imageLinks");                        String thumbnail = imageLinks.optString("thumbnail");                        String previewLink = volumeObj.optString("previewLink");                        String infoLink = volumeObj.optString("infoLink");                        JSONObject saleInfoObj = itemsObj.optJSONObject("saleInfo");                        String buyLink = saleInfoObj.optString("buyLink");                        ArrayList<String> authorsArrayList = new ArrayList<>();                        if (authorsArray.length() != 0) {                            for (int j = 0; j < authorsArray.length(); j++) {                                authorsArrayList.add(authorsArray.optString(i));                            }                        }                        // after extracting all the data we are                         // saving this data in our modal class.                         BookInfo bookInfo = new BookInfo(title, subtitle, authorsArrayList, publisher, publishedDate, description, pageCount, thumbnail, previewLink, infoLink, buyLink);                                                  // below line is use to pass our modal                         // class in our array list.                        bookInfoArrayList.add(bookInfo);                                                  // below line is use to pass our                         // array list in adapter class.                        BookAdapter adapter = new BookAdapter(bookInfoArrayList, MainActivity.this);                                                  // below line is use to add linear layout                        // manager for our recycler view.                        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this, RecyclerView.VERTICAL, false);                        RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.idRVBooks);                                                  // in below line we are setting layout manager and                         // adapter to our recycler view.                        mRecyclerView.setLayoutManager(linearLayoutManager);                        mRecyclerView.setAdapter(adapter);                    }                } catch (JSONException e) {                    e.printStackTrace();                    // displaying a toast message when we get any error from API                    Toast.makeText(MainActivity.this, "No Data Found" + e, Toast.LENGTH_SHORT).show();                }            }        }, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError error) {                // also displaying error message in toast.                Toast.makeText(MainActivity.this, "Error found is " + error, Toast.LENGTH_SHORT).show();            }        });        // at last we are adding our json object        // request in our request queue.        queue.add(booksObjrequest);    }}
Check out the project on the below link: https://github.com/ChaitanyaMunje/LibraryApp
android
Technical Scripter 2020
Android
Java
Technical Scripter
Java
Android
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Resource Raw Folder in Android Studio
Flutter - Custom Bottom Navigation Bar
How to Read Data from SQLite Database in Android?
Retrofit with Kotlin Coroutine in Android
How to Post Data to API using Retrofit in Android?
Arrays in Java
Split() String method in Java with examples
For-each loop in Java
Object Oriented Programming (OOPs) Concept in Java
Arrays.sort() in Java with examples