¿Cómo crear un RecyclerView personalizado como Facebook en Android?

Hemos visto implementar RecyclerView en Android con datos simples dentro de nuestra aplicación. En este artículo, veremos la implementación de Facebook como Custom RecyclerView en Android .  

¿Qué vamos a construir en este artículo? 

Construiremos una aplicación simple en la que mostraremos Facebook como RecyclerView en nuestra aplicación de Android. Obtendremos estos datos de una API simple ( https://jsonkeeper.com/b/OB3B ) que se proporciona en el artículo. Con la ayuda de esta API, mostraremos esos datos en nuestro RecyclerView. qué

Build a Facebook Like Custom RecyclerView in Android Sample GIF

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 a continuación en su archivo build.gradle A continuación se muestra la dependencia de Volley que usaremos para obtener los datos de la API. Para agregar esta dependencia, vaya a la aplicación > Gradle Scripts > build.gradle(app) y agregue la dependencia a continuación en la sección de dependencias.    

// dependencia para cargar datos del archivo json.

implementación ‘com.android.volley:volley:1.1.1’

// dependencia para cargar imagen desde url.

implementación ‘com.squareup.picasso:picasso:2.71828’

// dependencia para crear una imagen circular.  

implementación ‘de.hdodenhof:circleimageview:3.1.0’

Paso 3: agregar permisos de Internet en su archivo AndroidManifest.xml

Como estamos cargando datos de Internet, para eso, tendremos que agregar los permisos de Internet a nuestro archivo AndroidManifest.xml . Vaya a la aplicación > archivo AndroidManifest.xml y agréguele el siguiente código.  

XML

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

 
Paso 4: trabajar con el archivo activity_main.xml

Vaya a la aplicación > res > diseño > actividad_principal.xml y agregue el siguiente código a ese archivo. 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">
 
    <!--recycler view for displaying
        our Facebook posts-->
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/idRVInstaFeeds"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
 
    <!--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="visible" />
     
</RelativeLayout>

 
Paso 5: crear un archivo dibujable personalizado para nuestra imagen de fondo

Navegue a la aplicación> res> dibujable> Haga clic con el botón derecho en él> Nuevo> archivo de recurso dibujable y nombre su archivo como background_drawable y agregue el código a continuación para nuestro fondo personalizado. 

XML

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <!--radius for our shape-->
    <corners android:radius="20dp" />
    <!--background color for our shape-->
    <solid android:color="#EDEDED" />
</shape>

 
Paso 6: crear un archivo de diseño para nuestro elemento de RecyclerView 

Navegue a la aplicación> res> diseño> Haga clic derecho en él> Nuevo> archivo de recursos de diseño y asígnele el nombre facebook_feed_rv_item y agregue el código a continuación. Se agregan comentarios en el código para conocer con más detalle. 

Nota: Los iconos usados ​​en este archivo están presentes en la carpeta dibujable. Navegue a la aplicación > res > carpeta dibujable y agregue sus íconos a esa carpeta. 

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="8dp"
    android:elevation="8dp"
    app:cardCornerRadius="8dp">
 
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
 
        <LinearLayout
            android:id="@+id/idLLTopBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:padding="4dp">
             
            <!--circle image for displaying the user image-->
            <de.hdodenhof.circleimageview.CircleImageView
                android:id="@+id/idCVAuthor"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_margin="5dp" />
 
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:orientation="vertical">
                 
                <!--text view for displaying user name-->
                <TextView
                    android:id="@+id/idTVAuthorName"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="3dp"
                    android:padding="3dp"
                    android:text="geeks_for_geeks"
                    android:textColor="@color/black"
                    android:textStyle="bold" />
 
                <!--textview for displaying post publish time-->
                <TextView
                    android:id="@+id/idTVTime"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:padding="3dp"
                    android:text="time"
                    android:textColor="@color/black"
                    android:textSize="11sp" />
                 
            </LinearLayout>
 
        </LinearLayout>
 
 
        <!--text view for displaying post description-->
        <TextView
            android:id="@+id/idTVDescription"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/idLLTopBar"
            android:layout_margin="5dp"
            android:padding="5dp"
            android:text="Description"
            android:textColor="@color/black"
            android:textSize="11sp" />
 
        <!--image view to display the post image-->
        <ImageView
            android:id="@+id/idIVPost"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:layout_below="@id/idTVDescription"
            android:adjustViewBounds="true"
            android:scaleType="fitCenter" />
 
        <!--linear layout for displaying facebook actions-->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/idIVPost"
            android:layout_margin="5dp"
            android:orientation="horizontal"
            android:padding="2dp"
            android:weightSum="3">
 
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                android:layout_weight="1"
                android:background="@drawable/background_drawable"
                android:orientation="horizontal"
                android:weightSum="2">
 
                <ImageView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_weight="1"
                    android:src="@drawable/ic_like" />
 
                <TextView
                    android:id="@+id/idTVLikes"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_margin="4dp"
                    android:layout_weight="1"
                    android:background="@drawable/background_drawable"
                    android:drawablePadding="3dp"
                    android:padding="5dp"
                    android:text="likes"
                    android:textColor="@color/black"
                    android:textSize="12sp" />
                 
            </LinearLayout>
 
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                android:layout_weight="1"
                android:background="@drawable/background_drawable"
                android:orientation="horizontal"
                android:weightSum="2">
 
                <ImageView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_weight="1"
                    android:src="@drawable/ic_comment" />
                 
                <TextView
                    android:id="@+id/idTVComments"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_margin="5dp"
                    android:layout_weight="1"
                    android:drawablePadding="3dp"
                    android:padding="5dp"
                    android:text="12"
                    android:textColor="@color/black"
                    android:textSize="12sp" />
            </LinearLayout>
 
            <LinearLayout
                android:id="@+id/idLLShare"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                android:layout_weight="1"
                android:background="@drawable/background_drawable"
                android:orientation="horizontal"
                android:weightSum="2">
 
                <ImageView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_weight="1"
                    android:src="@drawable/ic_share" />
 
                <TextView
                    android:id="@+id/idTVShare"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_margin="4dp"
                    android:layout_weight="1"
                    android:background="@drawable/background_drawable"
                    android:drawablePadding="3dp"
                    android:padding="5dp"
                    android:text="Share"
                    android:textColor="@color/black"
                    android:textSize="12sp" />
 
            </LinearLayout>
 
        </LinearLayout>
 
    </RelativeLayout>
 
</androidx.cardview.widget.CardView>

 
 Paso 7: Crear una clase modal para almacenar nuestros datos 

Vaya a la aplicación > java > el nombre del paquete de su aplicación > haga clic con el botón derecho en él > Nuevo > clase Java y nombre su clase como FacebookFeedModal y agréguele el siguiente código. 

Java

public class FacebookFeedModal {
    // variables for storing our author image,
    // author name, postDate,postDescription,
    // post image,post likes,post comments.
    private String authorImage;
    private String authorName;
    private String postDate;
    private String postDescription;
    private String postIV;
    private String postLikes;
    private String postComments;
     
    // creating getter and setter methods.
    public String getAuthorImage() {
        return authorImage;
    }
 
    public void setAuthorImage(String authorImage) {
        this.authorImage = authorImage;
    }
 
    public String getAuthorName() {
        return authorName;
    }
 
    public void setAuthorName(String authorName) {
        this.authorName = authorName;
    }
 
    public String getPostDate() {
        return postDate;
    }
 
    public void setPostDate(String postDate) {
        this.postDate = postDate;
    }
 
    public String getPostDescription() {
        return postDescription;
    }
 
    public void setPostDescription(String postDescription) {
        this.postDescription = postDescription;
    }
 
    public String getPostIV() {
        return postIV;
    }
 
    public void setPostIV(String postIV) {
        this.postIV = postIV;
    }
 
    public String getPostLikes() {
        return postLikes;
    }
 
    public void setPostLikes(String postLikes) {
        this.postLikes = postLikes;
    }
 
    public String getPostComments() {
        return postComments;
    }
 
    public void setPostComments(String postComments) {
        this.postComments = postComments;
    }
 
    // creating a constructor class.
    public FacebookFeedModal(String authorImage, String authorName, String postDate,
                             String postDescription, String postIV, String postLikes,
                             String postComments) {
        this.authorImage = authorImage;
        this.authorName = authorName;
        this.postDate = postDate;
        this.postDescription = postDescription;
        this.postIV = postIV;
        this.postLikes = postLikes;
        this.postComments = postComments;
    }
}

 
Paso 8: crear una clase de adaptador para configurar datos en nuestro elemento de RecyclerView

Vaya a la aplicación > java > el nombre del paquete de su aplicación > haga clic con el botón derecho en él > Nueva clase de Java y asígnele el nombre FacebookFeedRVAdapter y agréguele el siguiente código. 

Java

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
 
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
 
import com.squareup.picasso.Picasso;
 
import java.util.ArrayList;
 
import de.hdodenhof.circleimageview.CircleImageView;
 
public class FacebookFeedRVAdapter extends RecyclerView.Adapter<FacebookFeedRVAdapter.ViewHolder> {
     
    // arraylist for our facebook feeds.
    private ArrayList<FacebookFeedModal> facebookFeedModalArrayList;
    private Context context;
 
    // creating a constructor for our adapter class.
    public FacebookFeedRVAdapter(ArrayList<FacebookFeedModal> facebookFeedModalArrayList, Context context) {
        this.facebookFeedModalArrayList = facebookFeedModalArrayList;
        this.context = context;
    }
 
    @NonNull
    @Override
    public FacebookFeedRVAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // inflating our layout for item of recycler view item.
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.facebook_feed_rv_item, parent, false);
        return new FacebookFeedRVAdapter.ViewHolder(view);
    }
 
    @Override
    public void onBindViewHolder(@NonNull FacebookFeedRVAdapter.ViewHolder holder, int position) {
        // getting data from array list and setting it to our modal class.
        FacebookFeedModal modal = facebookFeedModalArrayList.get(position);
         
        // setting data to each view of recyclerview item.
        Picasso.get().load(modal.getAuthorImage()).into(holder.authorIV);
        holder.authorNameTV.setText(modal.getAuthorName());
        holder.timeTV.setText(modal.getPostDate());
        holder.descTV.setText(modal.getPostDescription());
        Picasso.get().load(modal.getPostIV()).into(holder.postIV);
        holder.likesTV.setText(modal.getPostLikes());
        holder.commentsTV.setText(modal.getPostComments());
    }
 
    @Override
    public int getItemCount() {
        // returning the size of our array list.
        return facebookFeedModalArrayList.size();
    }
 
    public class ViewHolder extends RecyclerView.ViewHolder {
        // creating variables for our views
        // of recycler view items.
        private CircleImageView authorIV;
        private TextView authorNameTV, timeTV, descTV;
        private ImageView postIV;
        private TextView likesTV, commentsTV;
        private LinearLayout shareLL;
 
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            // initializing our variables
            shareLL = itemView.findViewById(R.id.idLLShare);
            authorIV = itemView.findViewById(R.id.idCVAuthor);
            authorNameTV = itemView.findViewById(R.id.idTVAuthorName);
            timeTV = itemView.findViewById(R.id.idTVTime);
            descTV = itemView.findViewById(R.id.idTVDescription);
            postIV = itemView.findViewById(R.id.idIVPost);
            likesTV = itemView.findViewById(R.id.idTVLikes);
            commentsTV = itemView.findViewById(R.id.idTVComments);
        }
    }
}

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.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 requestqueue,
    // array list, progressbar, edittext,
    // image button and our recycler view.
    private RequestQueue mRequestQueue;
    private ArrayList<FacebookFeedModal> instaModalArrayList;
    private ArrayList<FacebookFeedModal> facebookFeedModalArrayList;
    private ProgressBar progressBar;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // initializing our views.
        progressBar = findViewById(R.id.idLoadingPB);
 
        // calling method to load
        // data in recycler view.
        getFacebookFeeds();
    }
 
    private void getFacebookFeeds() {
        facebookFeedModalArrayList = 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 stored in
        // string for our sample data
        String url = "https://jsonkeeper.com/b/OB3B";
 
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                progressBar.setVisibility(View.GONE);
                try {
                    // in below line we are extracting the data from json object.
                    String authorName = response.getString("authorName");
                    String authorImage = response.getString("authorImage");
                     
                    // below line is to get json array from our json object.
                    JSONArray feedsArray = response.getJSONArray("feeds");
                     
                    // running a for loop to add data to our array list
                    for (int i = 0; i < feedsArray.length(); i++) {
                        // getting json object of our json array.
                        JSONObject feedsObj = feedsArray.getJSONObject(i);
                         
                        // extracting data from our json object.
                        String postDate = feedsObj.getString("postDate");
                        String postDescription = feedsObj.getString("postDescription");
                        String postIV = feedsObj.getString("postIV");
                        String postLikes = feedsObj.getString("postLikes");
                        String postComments = feedsObj.getString("postComments");
                         
                        // adding data to our modal class.
                        FacebookFeedModal feedModal = new FacebookFeedModal(authorImage, authorName, postDate, postDescription, postIV, postLikes, postComments);
                        facebookFeedModalArrayList.add(feedModal);
                         
                        // below line we are creating an adapter class and adding our array list in it.
                        FacebookFeedRVAdapter adapter = new FacebookFeedRVAdapter(facebookFeedModalArrayList, MainActivity.this);
                        RecyclerView instRV = findViewById(R.id.idRVInstaFeeds);
                         
                        // below line is for setting linear layout manager to our recycler view.
                        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this, RecyclerView.VERTICAL, false);
                         
                        // below line is to set layout 
                        // manager to our recycler view.
                        instRV.setLayoutManager(linearLayoutManager);
                        
                        // below line is to set adapter
                        // to our recycler view.
                        instRV.setAdapter(adapter);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(MainActivity.this, "Fail to get data with error " + error, Toast.LENGTH_SHORT).show();
            }
        });
        mRequestQueue.add(jsonObjectRequest);
    }
}

 
Ahora ejecute su aplicación y vea el resultado de la aplicación. 

Producción:

Puede consultar el proyecto en el siguiente enlace: https://github.com/ChaitanyaMunje/LibraryApp/tree/FacebookBranch

Publicación traducida automáticamente

Artículo escrito por chaitanyamunje y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *