Si está buscando crear una aplicación de biblioteca de libros y desea cargar una gran cantidad de datos de libros, para agregar esta función, debe usar una API simple que proporciona Google y, por supuesto, es gratis. En este artículo, veremos la implementación de esta API en nuestra aplicación de Android.
¿Qué vamos a construir en este artículo?
Construiremos una aplicación simple en la que buscaremos diferentes tipos de libros y podremos ver la lista de libros relacionados con ese tema en nuestro RecyclerView . Para buscar estos libros, utilizaremos una API gratuita proporcionada por Google que contiene una gran colección de libros. qué
Implementación paso a paso
Paso 1: Crear un nuevo proyecto
Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Java como lenguaje de programación.
Paso 2: agregue la dependencia de Volley en sus archivos Gradle
Vaya a la aplicación > Gradle Scripts > archivo build.gradle y agregue la dependencia a continuación en la sección de dependencias.
implementación ‘com.android.volley:volley:1.1.1’
implementación ‘com.squareup.picasso:picasso:2.71828’
Después de agregar las dependencias a continuación en su archivo gradle, ahora sincronice su proyecto y ahora avanzaremos hacia nuestro archivo activity_main.xml . Como usaremos volley para obtener datos de nuestra API y la biblioteca de carga de imágenes de Picasso para cargar imágenes desde la URL.
Paso 3: Agregar permisos para Internet
Vaya a la aplicación > AndroidManifest.xml y agréguele los siguientes permisos.
XML
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Como cargaremos los libros desde la API, debemos solicitar permisos de Internet al usuario. Para eso, agregue los permisos para Internet en AndroidManifest.xml .
Paso 4: trabajar con el archivo activity_main.xml
Vaya al archivo activity_main.xml y consulte el siguiente código. A continuación se muestra el código para el archivo activity_main.xml .
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>
Paso 5: crear una clase modal para almacenar nuestros datos desde la API.
Para crear una nueva clase Modal. Navegue a la aplicación > java > el nombre del paquete de su aplicación > haga clic con el botón derecho en él y haga clic en Nuevo > clase Java y asigne un nombre a nuestra clase java como BookInfo y agréguele el código a continuación. Se agregan comentarios en el código para conocer con más detalle.
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; } }
Paso 6: Cree un nuevo archivo de recursos de diseño
Vaya a la aplicación > res > diseño > haga clic con el botón derecho en > Nuevo > Archivo de recursos de diseño y nombre el archivo como book_rv_item y agregue el siguiente código a este archivo.
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>
Paso 7: crear una clase de adaptador para configurar nuestros datos en el elemento de RecyclerView
Navegue a la aplicación> Java> el nombre del paquete de su aplicación> Haga clic con el botón derecho en él. Haga clic en Nuevo> Clase Java y asígnele el nombre BookAdapter y agregue el código a continuación. Se agregan comentarios en el código para conocer con más detalle.
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); } } }
Paso 8: Crear una nueva actividad para mostrar nuestra información del libro en detalle
Vaya a la aplicación > java > el nombre del paquete de su aplicación > haga clic con el botón derecho en él y haga clic en Nuevo > Actividad > Seleccione Actividad vacía y asígnele el nombre BookDetails . Asegúrate de seleccionar Actividad vacía.
Trabajando con el archivo activity_book_details.xml:
detalles_libro_actividades.xml detalles_libro_actividades.xml
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>
Trabajar con el archivo BookDetails.java:
Detalles del libro.java Detalles del libro.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<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); } }); } }
Paso 9: trabajar con el archivo MainActivity.java
Vaya al archivo MainActivity.java y consulte el siguiente código. A continuación se muestra el código del archivo MainActivity.java . Se agregan comentarios dentro del código para comprender el código con más detalle.
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); } }
Producción:
Consulte el proyecto en el siguiente enlace: https://github.com/ChaitanyaMunje/LibraryApp
Publicación traducida automáticamente
Artículo escrito por chaitanyamunje y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA