Step1: build.gradle
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'de.hdodenhof:circleimageview:3.1.0'
Step2: activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:background="#FFFFFF"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/userRecycler"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/search_bar" />
<EditText
android:id="@+id/search_bar"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:background="@drawable/search"
android:drawableStart="@drawable/ic_baseline_search_24"
android:ems="10"
android:hint="@string/search_your_product"
android:inputType="textPersonName"
android:padding="16dp"
android:paddingStart="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:importantForAutofill="no" />
</androidx.constraintlayout.widget.ConstraintLayout>
Step3: MainActivity.java
package in.learncodewithrk.androidxrecyclerview;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
RecyclerView userRecycler;
RecyclerviewAdapter recyclerviewAdapter;
EditText searchView;
CharSequence search="";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
searchView = findViewById(R.id.search_bar);
List<UserData> userDataList = new ArrayList<>();
userDataList.add(new UserData("jeans","Lorem Ipsum is simply dummy text of the printing and typesetting industry.", R.drawable.jeans));
userDataList.add(new UserData("top","Lorem Ipsum is simply dummy text of the printing and typesetting industry.", R.drawable.top));
userDataList.add(new UserData("shoes","Lorem Ipsum is simply dummy text of the printing and typesetting industry.", R.drawable.shoes));
userDataList.add(new UserData("vegetable","Lorem Ipsum is simply dummy text of the printing and typesetting industry.", R.drawable.vegetable));
userDataList.add(new UserData("fruit","Lorem Ipsum is simply dummy text of the printing and typesetting industry.", R.drawable.fruit));
userDataList.add(new UserData("chicken","Lorem Ipsum is simply dummy text of the printing and typesetting industry.", R.drawable.chicken));
userDataList.add(new UserData("fish","Lorem Ipsum is simply dummy text of the printing and typesetting industry.", R.drawable.fish));
userDataList.add(new UserData("top","Lorem Ipsum is simply dummy text of the printing and typesetting industry.", R.drawable.top));
userDataList.add(new UserData("shoes","Lorem Ipsum is simply dummy text of the printing and typesetting industry.", R.drawable.shoes));
userDataList.add(new UserData("fruit","Lorem Ipsum is simply dummy text of the printing and typesetting industry.", R.drawable.fruit));
userDataList.add(new UserData("chicken","Lorem Ipsum is simply dummy text of the printing and typesetting industry.", R.drawable.chicken));
userDataList.add(new UserData("vegetable","Lorem Ipsum is simply dummy text of the printing and typesetting industry.", R.drawable.vegetable));
userDataList.add(new UserData("fruit","Lorem Ipsum is simply dummy text of the printing and typesetting industry.", R.drawable.fruit));
userDataList.add(new UserData("fish","Lorem Ipsum is simply dummy text of the printing and typesetting industry.", R.drawable.fish));
userDataList.add(new UserData("top","Lorem Ipsum is simply dummy text of the printing and typesetting industry.", R.drawable.top));
userDataList.add(new UserData("shoes","Lorem Ipsum is simply dummy text of the printing and typesetting industry.", R.drawable.shoes));
setUserRecycler(userDataList);
searchView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
recyclerviewAdapter.getFilter().filter(charSequence);
search = charSequence;
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
private void setUserRecycler(List<UserData> userDataList){
userRecycler = findViewById(R.id.userRecycler);
RecyclerView.LayoutManager layoutManager= new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
userRecycler.setLayoutManager(layoutManager);
recyclerviewAdapter = new RecyclerviewAdapter(this, userDataList);
userRecycler.setAdapter(recyclerviewAdapter);
}
}
Step4: RecyclerviewAdapter.java
package in.learncodewithrk.androidxrecyclerview;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import de.hdodenhof.circleimageview.CircleImageView;
public class RecyclerviewAdapter extends RecyclerView.Adapter<RecyclerviewAdapter.RecyclerviewHolder> {
Context context;
List<UserData> userDataList;
List<UserData> filteredUserDataList;
public RecyclerviewAdapter(Context context, List<UserData> userDataList) {
this.context = context;
this.userDataList = userDataList;
this.filteredUserDataList = userDataList;
}
public RecyclerviewAdapter(MainActivity context, List<android.service.autofill.UserData> userDataList) {
}
@NonNull
@Override
public RecyclerviewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.recyclerview_row_item, parent, false);
return new RecyclerviewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerviewHolder holder, int position) {
holder.userName.setText(filteredUserDataList.get(position).getUserName());
holder.userDesc.setText(filteredUserDataList.get(position).getDescp());
holder.userImage.setImageResource(filteredUserDataList.get(position).getImageUrl());
ItemAnimation.animateFadeIn(holder.itemView, position);
}
@Override
public int getItemCount() {
return filteredUserDataList.size();
}
public static final class RecyclerviewHolder extends RecyclerView.ViewHolder {
CircleImageView userImage;
TextView userName, userDesc;
public RecyclerviewHolder(@NonNull View itemView) {
super(itemView);
userImage = itemView.findViewById(R.id.userImage);
userName = itemView.findViewById(R.id.userName);
userDesc = itemView.findViewById(R.id.userDesc);
}
}
public Filter getFilter(){
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String Key = charSequence.toString();
if(Key.isEmpty()){
filteredUserDataList = userDataList;
}
else{
List<UserData> lstFiltered = new ArrayList<>();
for(UserData row: userDataList){
if(row.getUserName().toLowerCase().contains(Key.toLowerCase())){
lstFiltered.add(row);
}
}
filteredUserDataList = lstFiltered;
}
FilterResults filterResults = new FilterResults();
filterResults.values = filteredUserDataList;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
filteredUserDataList = (List<UserData>)filterResults.values;
notifyDataSetChanged();
}
};
}
}
Step5: UserData.java
package in.learncodewithrk.androidxrecyclerview;
public class UserData {
String userName;
String descp;
Integer imageUrl;
public UserData(String userName, String descp, Integer imageUrl) {
this.userName = userName;
this.descp = descp;
this.imageUrl = imageUrl;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getDescp() {
return descp;
}
public void setDescp(String descp) {
this.descp = descp;
}
public Integer getImageUrl() {
return imageUrl;
}
public void setImageUrl(Integer imageUrl) {
this.imageUrl = imageUrl;
}
}
Step6: ItemAnimation.java
package in.learncodewithrk.androidxrecyclerview;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.view.View;
public class ItemAnimation {
/* animation duration */
private static final long DURATION_IN_BOTTOM_UP = 150;
private static final long DURATION_IN_FADE_ID = 500;
private static final long DURATION_IN_LEFT_RIGHT = 150;
private static final long DURATION_IN_RIGHT_LEFT = 150;
public static void animateBottomUp(View view, int position) {
boolean not_first_item = position == -1;
position = position + 1;
view.setTranslationY(not_first_item ? 800 : 500);
view.setAlpha(0.f);
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator animatorTranslateY = ObjectAnimator.ofFloat(view, "translationY", not_first_item ? 800 : 500, 0);
ObjectAnimator animatorAlpha = ObjectAnimator.ofFloat(view, "alpha", 1.f);
animatorTranslateY.setStartDelay(not_first_item ? 0 : (position * DURATION_IN_BOTTOM_UP));
animatorTranslateY.setDuration((not_first_item ? 3 : 1) * DURATION_IN_BOTTOM_UP);
animatorSet.playTogether(animatorTranslateY, animatorAlpha);
animatorSet.start();
}
public static void animateFadeIn(View view, int position) {
boolean not_first_item = position == -1;
position = position + 1;
view.setAlpha(0.f);
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator animatorAlpha = ObjectAnimator.ofFloat(view, "alpha", 0.f, 0.5f, 1.f);
ObjectAnimator.ofFloat(view, "alpha", 0.f).start();
animatorAlpha.setStartDelay(not_first_item ? DURATION_IN_FADE_ID / 2 : (position * DURATION_IN_FADE_ID / 3));
animatorAlpha.setDuration(DURATION_IN_FADE_ID);
animatorSet.play(animatorAlpha);
animatorSet.start();
}
public static void animateLeftRight(View view, int position) {
boolean not_first_item = position == -1;
position = position + 1;
view.setTranslationX(-400f);
view.setAlpha(0.f);
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator animatorTranslateY = ObjectAnimator.ofFloat(view, "translationX", -400f, 0);
ObjectAnimator animatorAlpha = ObjectAnimator.ofFloat(view, "alpha", 1.f);
ObjectAnimator.ofFloat(view, "alpha", 0.f).start();
animatorTranslateY.setStartDelay(not_first_item ? DURATION_IN_LEFT_RIGHT : (position * DURATION_IN_LEFT_RIGHT));
animatorTranslateY.setDuration((not_first_item ? 2 : 1) * DURATION_IN_LEFT_RIGHT);
animatorSet.playTogether(animatorTranslateY, animatorAlpha);
animatorSet.start();
}
public static void animateRightLeft(View view, int position) {
boolean not_first_item = position == -1;
position = position + 1;
view.setTranslationX(view.getX() + 400);
view.setAlpha(0.f);
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator animatorTranslateY = ObjectAnimator.ofFloat(view, "translationX", view.getX() + 400, 0);
ObjectAnimator animatorAlpha = ObjectAnimator.ofFloat(view, "alpha", 1.f);
ObjectAnimator.ofFloat(view, "alpha", 0.f).start();
animatorTranslateY.setStartDelay(not_first_item ? DURATION_IN_RIGHT_LEFT : (position * DURATION_IN_RIGHT_LEFT));
animatorTranslateY.setDuration((not_first_item ? 2 : 1) * DURATION_IN_RIGHT_LEFT);
animatorSet.playTogether(animatorTranslateY, animatorAlpha);
animatorSet.start();
}
}
Step7: recyclerview_row_item.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/userImage"
android:layout_width="66dp"
android:layout_height="64dp"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_launcher_background"
android:layout_marginLeft="16dp" />
<TextView
android:id="@+id/userName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="TextView"
android:textColor="#000000"
android:textStyle="bold"
app:layout_constraintStart_toEndOf="@+id/userImage"
app:layout_constraintTop_toTopOf="@+id/userImage"
android:layout_marginLeft="16dp" />
<TextView
android:id="@+id/userDesc"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/userName"
app:layout_constraintTop_toBottomOf="@+id/userName" />
<View
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:background="@android:color/darker_gray"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/userDesc"
app:layout_constraintTop_toBottomOf="@+id/userDesc"
android:layout_marginRight="16dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
0 Comments