GenericRecyclerView در اندروید

چقدر در مورد کلاس های Generic میدانید ؟

برای مثال اگر به ساختار ArrayList در جاوا دقت کنید مشاهده میکنید نوع متغیر داخل نماد <> نوشته میشه !

تا به حال از خودتون سوال کردید ساختار کد نویسی ArrayList چطوری نوشته شده که هر متغیر یا هر کلاسی رو قبول میکنه ؟

پاسخ دقیقا همین روش Gerneric در برنامه نویسی است .

برای اینکه بهتر متوجه بشید به مثال زیر دقت کنید

در کد نویسی فوق کلاسی با نام Box ساختیم تا هر مقداری که میخواهیم داخلش وارد کنیم و از همان مقدار استفاده کنیم که برای استفاده از کد بالا نیاز به پیاده سازی کلاس به صورت زیر داریم .

بسیار خب حالا که خوب فهمیدید منظور ما از Generic چیست شمارو دعوت میکنم به استفاده از Adapter زیر برای RecyclerView در اندروید که البته باید به نکات زیر توجه کنید .

  • روش کد نویسی به صورت معماری MVVM است
  • روش کد نویسی به صورت DataBinding در برنامه نویسی اندروید است

بنابراین برای استفاده از این کلاس باید معماری MVVM و DataBinding رو کامل یاد گرفته باشید که میتوانید از لینک زیر هم به این کلاس دسترسی داشته باشید هم معماری MVVM و DataBinding رو آموزش ببینید .

برای آموزش MVVM و DataBiniding کلیک کنید

خب ، اگر با MVVM آشنایی پیدا کردید که به کد زیر دقت کنید

public abstract class PublicAdapterBinding<T,D> extends RecyclerView.Adapter {
    private Context context;
    private List<T> arrayList;
    private LayoutInflater layoutInflater;


    public abstract int getLayoutResId();
    public abstract void onBindData(T model, int position, D dataBinding);
  //  public abstract void onItemClick(T model, int position);

    public PublicAdapterBinding(List<T> arrayList) {
        this.arrayList = arrayList;
    }


    class CustomView extends RecyclerView.ViewHolder {
        protected D mDataBinding;

        public CustomView(ViewDataBinding binding) {
            super(binding.getRoot());
            mDataBinding = (D) binding;
        }

    }


    @Override
    public CustomView onCreateViewHolder(final ViewGroup parent, int viewType) {

        if (layoutInflater == null)
            layoutInflater = LayoutInflater.from(parent.getContext());
        final ViewDataBinding dataBinding = DataBindingUtil.inflate(layoutInflater, getLayoutResId(), parent, false);
        context = parent.getContext();
        return new CustomView(dataBinding);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, @SuppressLint("RecyclerView") final int position) {
        onBindData(arrayList.get(position), position, ((CustomView) holder).mDataBinding);


       /* ((ViewDataBinding) ((CustomView) holder).mDataBinding).getRoot().setListener(new View.Listener() {
            @Override
            public void (View view) {
                onItemClick(arrayList.get(position), position);
            }
        });*/
    }

    @Override
    public int getItemCount() {
        return arrayList.size();
    }


    public void addItem(T model, RecyclerView view) {
        arrayList.add(model);
        //this.notifyDataSetChanged();
        if (arrayList.size() > 1)
            view.scrollToPosition(arrayList.size() - 1);
    }

    public void addItems(List<T> arrayList, RecyclerView view) {
        this.arrayList = arrayList;
        if (arrayList.size() > 1)
            view.scrollToPosition(arrayList.size() - 1);
        //this.notifyDataSetChanged();

    }



    public T getItem(int position) {
        return arrayList.get(position);
    }

    public Context getContext() {
        return context;
    }

    public void removeAt(int position) {
        arrayList.remove(position);
        notifyItemRemoved(position);
        /*new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                notifydata(arrayList);
            }
        }, 500);*/

    }

    private void notifydata(List<T> list) {
        if (arrayList != null) {
            arrayList.clear();
            arrayList.addAll(list);

        } else {
            arrayList = list;
        }
        notifyDataSetChanged();
    }


    public interface ClickListeners {
        void Listener();
    }
}

بسیار خب . همانطور که مشاهده میکنید با استفاده از Generic مقدار آرایه و دیتابایندینگی که میخوایم رو به صورت زیر داخل کلاس ارسال میکنیم و ازشون استفاده میکنیم

برای فهم بیشتر در رابطه با این نوع Adapter پیشنهاد میکنم سورس کد رو از Github من دانلود کنید .

برای دانلود سورس کد کلیک کنید