Skip to content

Instantly share code, notes, and snippets.

@omeraydindev
Last active May 29, 2022 16:55
Show Gist options
  • Save omeraydindev/209793d25d7933607f15d247ce46fc21 to your computer and use it in GitHub Desktop.
Save omeraydindev/209793d25d7933607f15d247ce46fc21 to your computer and use it in GitHub Desktop.
Easy-to-use generic helper class to help reduce RecyclerView adapter boilerplate by wrapping an adapter internally. This can be useful for when you just need a basic, easy, fast adapter solution without the usual boilerplate that we've grown used to with RecyclerView adapters. Supports drag-drop reordering out of the box. See below for an example.
/*
* This is free and unencumbered software released into the public domain.
* For more information, please refer to <http://unlicense.org/>
*/
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.Collections;
public class FastAdapter<T> {
private final RVAdapter adapter;
public FastAdapter(Context context, int resource, ArrayList<T> data, BindListener<T> bindListener) {
adapter = new RVAdapter(context, resource, data, bindListener);
}
public void into(RecyclerView recyclerView) {
into(recyclerView, false);
}
public void into(RecyclerView recyclerView, boolean dragDrop) {
recyclerView.setAdapter(adapter);
if (dragDrop) {
attachDragDrop(recyclerView);
}
}
public ArrayList<T> getList() {
return adapter.mData;
}
public void refresh() {
adapter.notifyDataSetChanged();
}
public interface BindListener<T> {
void onBind(View rootView, T item, int pos);
}
private void attachDragDrop(RecyclerView recyclerView) {
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.START | ItemTouchHelper.END, 0) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
int fromPosition = viewHolder.getAdapterPosition();
int toPosition = target.getAdapterPosition();
Collections.swap(adapter.mData, fromPosition, toPosition);
recyclerView.getAdapter().notifyItemMoved(fromPosition, toPosition);
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
}
private class RVAdapter extends RecyclerView.Adapter<RVAdapter.ViewHolder> {
private final int resource;
public final ArrayList<T> mData;
private final LayoutInflater mInflater;
private final BindListener<T> bindListener;
public RVAdapter(Context context, int resource, ArrayList<T> data, BindListener<T> bindListener) {
this.resource = resource;
this.mInflater = LayoutInflater.from(context);
this.mData = data;
this.bindListener = bindListener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = mInflater.inflate(resource, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
T item = getItem(position);
bindListener.onBind(holder.root, item, position);
}
@Override
public int getItemCount() {
return mData.size();
}
private class ViewHolder extends RecyclerView.ViewHolder {
View root;
ViewHolder(View itemView) {
super(itemView);
root = itemView;
}
}
T getItem(int id) {
return mData.get(id);
}
}
}
@omeraydindev
Copy link
Author

Example usage:

FastAdapter(this, R.layout.item_stat_lv, list) { rootView, item, _ ->
  ItemStatLvBinding.bind(rootView).apply {
    deviceId.text = item.deviceId
    type.text = item.type
    time.text = item.time
    date.text = item.date
    country.text = item.country
  }
}.into(binding.recyclerView)

binding.recyclerView.layoutManager = LinearLayoutManager(context)

@omeraydindev
Copy link
Author

Disclaimer: This is meant to be a very basic & easy-to-use "adapter" for basic lists in your app that don't need the usual boilerplate; obviously regular adapters would have more features like DiffUtil integration, swipe actions etc. You are welcome to improve on it and add finer control over the internal adapter though.

@j-px
Copy link

j-px commented May 29, 2022

Under what license's the code? If you don't really care, I'd recommend The Unlicense. Ideally, a single comment like this in the systemd source repo is enough.

@omeraydindev
Copy link
Author

Under what license's the code? If you don't really care, I'd recommend The Unlicense. Ideally, a single comment like this in the systemd source repo is enough.

Thanks, added The Unlicense as the license. It goes without saying but I'm going to say it anyway -- same license applies to the example snippet above.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment