Recycler view Vertically with Data Binding
more details about data binding than click on this http://androidcodeteam.com/binding/
If you use Data Binding then use a tag in app build.gradle file
android.buildFeatures.dataBinding true
After that Rebuild your project
Add Dependency:
dependencies { implementation 'com.google.android.material:material:1.2.1' implementation 'com.github.bumptech.glide:glide:4.11.0' }
Main.xml file
<?xml version="1.0" encoding="utf-8"?> <layout> <data> <import type="android.view.View"/> </data> <androidx.appcompat.widget.LinearLayoutCompat 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" android:layout_marginTop="5dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:background="#F1F1F1" tools:context=".MainActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="match_parent" tools:listitem="@layout/item_view" tools:itemCount="5" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/> </androidx.appcompat.widget.LinearLayoutCompat> </layout>
Main.java file
import androidx.appcompat.app.AppCompatActivity; import androidx.databinding.DataBindingUtil; import androidx.recyclerview.widget.RecyclerView; import android.os.Bundle; import com.verticalrecyclerview.databinding.ActivityMainBinding; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this,R.layout.activity_main); init(); } private void init() { Adapter adapter = new Adapter(this,setData()); binding.recycler.setAdapter(adapter); } private List<DataBean> setData() { List<DataBean> dataBeanList = new ArrayList<>(); for(int i=0;i<15;i++) { DataBean dataBean = new DataBean(); dataBean.setTitle("My App"); dataBean.setDes("Lorem Ipsum is simply dummy text of the printing and typesetting industry."); dataBean.setImg(R.drawable.h1); dataBeanList.add(dataBean); } return dataBeanList; } }
Adepter.java file
import android.content.Context; 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.core.widget.ImageViewCompat; import androidx.core.widget.TextViewCompat; import androidx.databinding.DataBindingUtil; import androidx.recyclerview.widget.RecyclerView; import com.verticalrecyclerview.databinding.ItemViewBinding; import java.util.List; public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder>{ private Context context; private List<DataBean> dataBeanList; public Adapter(Context context,List<DataBean> dataBeanList) { this.context = context; this.dataBeanList = dataBeanList; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { LayoutInflater layoutInflater = LayoutInflater.from(context); ItemViewBinding binding = DataBindingUtil.inflate(layoutInflater,R.layout.item_view,parent,false); return new ViewHolder(binding); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.binding.setObj(dataBeanList.get(position)); } @Override public int getItemCount() { return dataBeanList.size(); } class ViewHolder extends RecyclerView.ViewHolder{ ItemViewBinding binding; public ViewHolder(@NonNull ItemViewBinding binding) { super(binding.getRoot()); this.binding = binding; } } }
Item_view.xml file
<?xml version="1.0" encoding="utf-8"?> <layout> <data> <import type="android.view.View" /> <variable name="obj" type="com.verticalrecyclerview.DataBean" /> </data> <androidx.appcompat.widget.LinearLayoutCompat 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:padding="10dp" android:layout_marginTop="5dp" android:background="#ffffff" android:orientation="horizontal"> <androidx.appcompat.widget.AppCompatImageView android:id="@+id/img" android:layout_width="50dp" android:layout_height="50dp" app:srcCompat="@drawable/h3" app:loadImage="@{obj.img}"/> <androidx.appcompat.widget.LinearLayoutCompat android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="5dp" android:paddingRight="5dp" android:text="@{obj.title,default=Mytitle}" /> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/des" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="5dp" android:paddingRight="5dp" android:text="@{obj.des,default=industry}" /> </androidx.appcompat.widget.LinearLayoutCompat> </androidx.appcompat.widget.LinearLayoutCompat> </layout>
LoadImage.java file
import android.widget.ImageView; import androidx.databinding.BindingAdapter; import com.bumptech.glide.Glide; public class LoadImage { @BindingAdapter("app:loadImage") public static void loadImage( ImageView view,int imageUrl) { Glide.with(view.getContext()).load(imageUrl).into(view); } }
DataBean.java File
public class DataBean { private int img; private String title; private String des; public int getImg() { return img; } public void setImg(int img) { this.img = img; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDes() { return des; } public void setDes(String des) { this.des = des; } }
Recycler view Vertically with Data Binding
more details about data binding than click on this http://androidcodeteam.com/binding/
If you use Data Binding then use a tag and plugin in app build.gradle file
if you use android studio 4.1.1 then use this
id 'kotlin-kapt'
if you use android studio 4.0.0 or below version then use this
apply plugin: 'kotlin-kapt'
Data binding Tag
android.buildFeatures.dataBinding true
Add Dependency:
dependencies { implementation 'com.google.android.material:material:1.2.1' implementation 'com.github.bumptech.glide:glide:4.11.0' }
Main.xml
<?xml version="1.0" encoding="utf-8"?> <layout> <data> <import type="android.view.View"/> </data> <androidx.appcompat.widget.LinearLayoutCompat 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" android:layout_marginTop="5dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:background="#F1F1F1" tools:context=".MainActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="match_parent" tools:listitem="@layout/item_view" tools:itemCount="5" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/> </androidx.appcompat.widget.LinearLayoutCompat> </layout>
Main.kt File
import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.RecyclerView import com.n.recyclerverticallyview.databinding.ActivityMainBinding import java.util.* class MainActivity : AppCompatActivity() { lateinit var binding:ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this,R.layout.activity_main) val adapter = Adapter(this, setData()) binding.recycler.adapter = adapter } private fun setData(): List<DataBean>? { val dataBeanList: MutableList<DataBean> = ArrayList() for (i in 0..14) { val dataBean = DataBean(R.drawable.h1,"My App","Lorem Ipsum is simply dummy text of the printing and typesetting industry.") dataBeanList.add(dataBean) } return dataBeanList } }
Adepter.kt File
import android.content.Context import android.database.DatabaseUtils import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil.inflate import androidx.recyclerview.widget.RecyclerView import com.n.recyclerverticallyview.databinding.ItemViewBinding class Adapter( var context: Context?, var dataBeanList: List<DataBean?>? ): RecyclerView.Adapter<Adapter.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val layoutInflater = LayoutInflater.from(context) val binding: ItemViewBinding = DataBindingUtil.inflate(layoutInflater,R.layout.item_view, parent, false) return ViewHolder(binding) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.binding.obj = dataBeanList!!.get(position) } override fun getItemCount(): Int { return dataBeanList!!.size } class ViewHolder(var binding: ItemViewBinding) : RecyclerView.ViewHolder(binding.root) { } }
Item_view.xml file
<?xml version="1.0" encoding="utf-8"?> <layout> <data> <import type="android.view.View" /> <variable name="obj" type="com.n.recyclerverticallyview.DataBean" /> </data> <androidx.appcompat.widget.LinearLayoutCompat 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:padding="10dp" android:layout_marginTop="5dp" android:background="#ffffff" android:orientation="horizontal"> <androidx.appcompat.widget.AppCompatImageView android:id="@+id/img" android:layout_width="50dp" android:layout_height="50dp" app:srcCompat="@drawable/h3" app:loadImage="@{obj.img}"/> <androidx.appcompat.widget.LinearLayoutCompat android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="5dp" android:paddingRight="5dp" android:text="@{obj.title,default=Mytitle}" /> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/des" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="5dp" android:paddingRight="5dp" android:text="@{obj.des,default=industry}" /> </androidx.appcompat.widget.LinearLayoutCompat> </androidx.appcompat.widget.LinearLayoutCompat> </layout>
LoadImage.kt File
import android.widget.ImageView import androidx.databinding.BindingAdapter import com.bumptech.glide.Glide class LoadImage { companion object { @JvmStatic @BindingAdapter("app:loadImage") fun loadImage(view: ImageView, imageUrl: Int) { Glide.with(view.context).load(imageUrl).into(view) } } }
DataBean.kt File
data class DataBean (var img:Int, var title: String, var des: String)