Search code examples
androidandroid-recyclerviewinterfaceandroid-cardviewandroid-viewbinding

How to use ViewBinding in a RecyclerView Adapter with Interface and Cardview in android java?


i always mostly required Recycleview with viewbinding using interface in android java done any one help to do same ??


Solution

  • First of all put below code in build.Gradle(Module) in side android brackets

    buildFeatures{
            viewBinding true
        }
    

    Step 1 - Create recycler view in main activity xml layout

    <?xml version="1.0" encoding="utf-8"?>
    <!-- 1 -->
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycle_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            ></androidx.recyclerview.widget.RecyclerView>
    
    </RelativeLayout>
    

    Step 2 - Create custom item layout xml By Right click on layout new -> layout Resource file

    <?xml version="1.0" encoding="utf-8"?>
    <!-- 2 -->
    <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_click"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardElevation="3dp"
        app:cardCornerRadius="10dp"
        app:cardUseCompatPadding="true"
        >
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            >
            <ImageView
                android:id="@+id/tv_logo"
                android:src="@color/black"
                android:padding="5dp"
                android:layout_width="100dp"
                android:layout_height="100dp" />
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:padding="5dp">
                <TextView
                    android:id="@+id/tv_title"
                    android:text="Amazon"
                    android:textSize="25sp"
                    android:textStyle="bold"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
                <RatingBar
                    android:id="@+id/ratingBar"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:progressTint="#EFD80E"
                    android:rating="3"
                    style="@style/Widget.AppCompat.RatingBar.Indicator" />
            </LinearLayout>
        </LinearLayout>
    </androidx.cardview.widget.CardView>
    

    Step 3 - Create Item Class in java

     package com.example.recyclerviewdemonewwithinterface.model;
    
    
        // 3
        public class Item {
            private int id;
            private String name;
            private float rating;
            private int image;
        
            public Item(int id, String name, float rating, int image) {
                this.id = id;
                this.name = name;
                this.rating = rating;
                this.image = image;
            }
        
            public int getId() {
                return id;
            }
            public void setId(int id) {
                this.id = id;
            }
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            public float getRating() {
                return rating;
            }
            public void setRating(float rating) {
                this.rating = rating;
            }
            public int getImage() {
                return image;
            }
            public void setImage(int image) {
                this.image = image;
            }
        }
    

    Step 4 - Create CustomItemAdapter Class in java

    package com.example.recyclerviewdemonewwithinterface.adapter;
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.ViewGroup;
    import android.widget.Toast;
    import androidx.annotation.NonNull;
    import androidx.recyclerview.widget.RecyclerView;
    
    import com.example.recyclerviewdemonewwithinterface.SetOnClickListener;
    import com.example.recyclerviewdemonewwithinterface.databinding.CustomItemLayoutBinding;
    import com.example.recyclerviewdemonewwithinterface.model.Item;
    import java.util.List;
    
    // 4
    public class CustomItemAdapter extends RecyclerView.Adapter<CustomItemAdapter.MyViewHolder> {
        CustomItemLayoutBinding binding;
        private Context context;
        private List<Item> itemList;
        // i3 & create constructor also
        private SetOnClickListener setOnClickListener;
    
        public CustomItemAdapter(Context context, List<Item> itemList, SetOnClickListener setOnClickListener) {
            this.context = context;
            this.itemList = itemList;
            this.setOnClickListener = setOnClickListener;
        }
        @NonNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            binding = CustomItemLayoutBinding.inflate(LayoutInflater.from(context),parent,false);
            MyViewHolder holder = new MyViewHolder(binding);
            return holder;
        }
        @Override
        public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
            Item item = itemList.get(position);
            holder.binding.tvLogo.setImageResource(item.getImage());
            holder.binding.tvTitle.setText(item.getName());
            holder.binding.ratingBar.setRating(item.getRating());
    
            // i4
            holder.binding.cardClick.setOnClickListener(view -> {
                setOnClickListener.onItemClick(item,position);
            });
            // click event from adapter
            /*holder.binding.cardClick.setOnClickListener(v -> {
                Toast.makeText(context, ""+item.getName(), Toast.LENGTH_SHORT).show();
            });*/
        }
        @Override
        public int getItemCount() {
            return itemList.size();
        }
    
        class MyViewHolder extends RecyclerView.ViewHolder {
            CustomItemLayoutBinding binding;
            public MyViewHolder(@NonNull CustomItemLayoutBinding binding) {
                super(binding.getRoot());
                this.binding = binding;
            }
        }
    }
    

    Step 5 - Create SetOnClickListener Interface in java

    package com.example.recyclerviewdemonewwithinterface;
    
    import com.example.recyclerviewdemonewwithinterface.model.Item;
    
    // 6
    public interface SetOnClickListener {
        // i1
        void onItemClick(Item item,int position);
        void onLongItemClick(Item item, int position);
    }
    

    Step 6 - Apply Below code in Main Activity Java

    package com.example.recyclerviewdemonewwithinterface;
    import android.os.Bundle;
    import android.widget.Toast;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.recyclerview.widget.LinearLayoutManager;
    
    import com.example.recyclerviewdemonewwithinterface.adapter.CustomItemAdapter;
    import com.example.recyclerviewdemonewwithinterface.databinding.ActivityMainBinding;
    import com.example.recyclerviewdemonewwithinterface.model.Item;
    
    import java.util.ArrayList;
    import java.util.List;
    
    // i2 & implement methods
    public class MainActivity extends AppCompatActivity implements SetOnClickListener {
        // 5
        ActivityMainBinding binding;
        List<Item> itemList;
        CustomItemAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            binding = ActivityMainBinding.inflate(getLayoutInflater());
            setContentView(binding.getRoot());
    
            prepareData();
    
            // i5 set interface in argument (Last this)
            adapter = new CustomItemAdapter(MainActivity.this, itemList, this);
    
            LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
            // to show listview horizontaly
            // LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this,LinearLayoutManager.HORIZONTAL,false);
            // to show grid view
            // GridLayoutManager layoutManager = new GridLayoutManager(MainActivity.this,3);
            // to show Straggered
            // StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
            // layout manager in recycle view
            binding.recycleView.setLayoutManager(layoutManager);
            binding.recycleView.setAdapter(adapter);
        }
    
        private void prepareData() {
            itemList = new ArrayList<>();
    
            itemList.add(new Item(1, "Instagram", 3.5f, R.drawable.ic_launcher_background));
            itemList.add(new Item(2, "Pinterest", 2.5f, R.drawable.ic_launcher_background));
            itemList.add(new Item(3, "YouTube", 3.f, R.drawable.ic_launcher_background));
            itemList.add(new Item(4, "Twitter", 5.5f, R.drawable.ic_launcher_background));
            itemList.add(new Item(5, "Whatsapp", 4.5f, R.drawable.ic_launcher_background));
        }
    
        @Override
        public void onItemClick(Item item, int position) {
            // i6
            // Toast.makeText(this, ""+itemList.get(position).getName(), Toast.LENGTH_SHORT).show();
            //
            Toast.makeText(this, "" + item.getId()+"___"+position, Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onLongItemClick(Item item, int position) {
    
        }
    }