如果您正在寻找构建图书库应用程序,并且想要加载大量图书数据,然后添加此功能,则必须使用Google提供的简单API,并且它是免费的。在本文中,我们将看看我们的Android应用程序中该API的实现。
我们将在本文中构建什么?
我们将构建一个简单的应用程序,在其中搜索不同类型的书籍,并在RecyclerView中看到与该主题相关的书籍清单。为了搜索这些图书,我们将使用Google提供的免费API,其中包含大量图书。下面提供了一个示例视频,以使您对我们在本文中将要做的事情有个大概的了解。注意,我们将使用Java语言实现该项目。
分步实施
步骤1:创建一个新项目
要在Android Studio中创建新项目,请参阅如何在Android Studio中创建/启动新项目。请注意,选择Java作为编程语言。
步骤2:在您的Gradle文件中添加Volley的依赖项
导航至应用程序> Gradle脚本> build.gradle文件,然后在“依赖项”部分中添加以下依赖项。
implementation ‘com.android.volley:volley:1.1.1’
implementation ‘com.squareup.picasso:picasso:2.71828’
在gradle文件中添加以下依赖项后,现在同步您的项目,现在我们将移向activity_main.xml文件。因为我们将使用凌空来从API和Picasso图像加载库中获取数据以从URL加载图像。
步骤3:为Internet添加权限
导航至应用程序> AndroidManifest.xml,然后向其添加以下权限。
XML
XML
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 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 getAuthors() {
return authors;
}
public void setAuthors(ArrayList 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 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;
}
}
XML
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 {
// creating variables for arraylist and context.
private ArrayList bookInfoArrayList;
private Context mcontext;
// creating constructor for array list and context.
public BookAdapter(ArrayList 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);
}
}
}
XML
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 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);
}
});
}
}
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 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() {
@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 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);
}
}
由于我们将从API加载图书,因此我们必须向用户请求Internet权限。为此,在AndroidManifest.xml中添加互联网的权限。
步骤4:使用activity_main.xml文件
转到activity_main.xml文件,并参考以下代码。以下是activity_main.xml文件的代码。
XML格式
第5步:创建一个模态类,用于存储来自API的数据。
用于创建新的Modal类。导航到应用程序> Java >您的应用程序的程序包名称>右键单击它,然后单击New> Java类,并为我们的Java类命名为BookInfo并在其中添加以下代码。在代码中添加了注释,以便更详细地了解。
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 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 getAuthors() {
return authors;
}
public void setAuthors(ArrayList 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 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;
}
}
步骤6:创建一个新的布局资源文件
转到应用程序> res>布局>右键单击>新建>布局资源文件,并将文件命名为book_rv_item并将以下代码添加到该文件中。
XML格式
第7步:创建一个Adapter类,以将我们的数据设置为RecyclerView的项
导航到应用程序> Java >应用程序的程序包名称>右键单击它,然后单击New> Java类,并将其命名为BookAdapter,然后向其添加以下代码。在代码中添加了注释,以便更详细地了解。
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 {
// creating variables for arraylist and context.
private ArrayList bookInfoArrayList;
private Context mcontext;
// creating constructor for array list and context.
public BookAdapter(ArrayList 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);
}
}
}
第8步:创建一个新活动以详细显示我们的图书信息
导航到应用程序> Java >应用程序的包名称>右键单击它,然后单击新建>活动>选择空活动并将其命名为BookDetails 。确保选择清空活动。
使用activity_book_details.xml文件:
转到activity_book_details.xml文件,并参考以下代码。以下是activity_book_details.xml文件的代码。
XML格式
使用BookDetails。 Java文件:
转到BookDetails。 Java文件并参考以下代码。下面是BookDetails的代码。 Java文件。在代码内部添加了注释,以更详细地了解代码。
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 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);
}
});
}
}
步骤9:使用MainActivity。 Java文件
转到MainActivity。 Java文件并参考以下代码。下面是MainActivity的代码。 Java文件。在代码内部添加了注释,以更详细地了解代码。
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 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() {
@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 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);
}
}
输出:
在以下链接上查看项目: https : //github.com/ChaitanyaMunje/LibraryApp