封裝RecyclerView.Adapter

一、定義抽象類

RecyclerView在項目中經(jīng)常出現(xiàn),與之一起的是Adapter的實現(xiàn)。在實現(xiàn)Adapter時,有一些步驟重復(fù),繁瑣。所以,在實現(xiàn)Adapter前,先進行一些封裝,能提高不少的開發(fā)效率,用的時候簡單,方便。

封裝要求:

  1. 布局和數(shù)據(jù)由外部(構(gòu)造函數(shù))傳入;
  2. Adapter的數(shù)據(jù)類型使用泛型;
  3. 綁定數(shù)據(jù)時,無需通過position獲取,直接返回泛型對象;
  4. 需類型安全;
  5. 封裝點擊事件,處理多重點擊;
  6. 點擊事件中返回泛型,即無需通過position到集合中拿數(shù)據(jù),直接返回泛型對象。

封裝Adapter類后的完整代碼:

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

public abstract class CustomBaseAdapter<T, VH extends CustomBaseAdapter.CustomBaseHolder> extends RecyclerView.Adapter<VH> {

    private List<T> list;

    private int layoutId;

    private Context context;

    private OnItemClickListener<T> onItemClickListener;

    private OnItemLongClickListener<T> onItemLongClickListener;

    public interface OnItemClickListener<A> {
        void onItemClick(View view, A a);
    }

    public interface OnItemLongClickListener<A> {
        void onItemLongClick(View view, A a);
    }

    public CustomBaseAdapter(int layoutId, List<T> list) {
        this.list = list;
        this.layoutId = layoutId;
    }

    public CustomBaseAdapter(Context context, int layoutId, List<T> list) {
        this.list = list;
        this.layoutId = layoutId;
        this.context = context;
    }

    public void setOnItemClickListener(OnItemClickListener<T> onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    public void setOnItemLongClickListener(OnItemLongClickListener<T> onItemLongClickListener) {
        this.onItemLongClickListener = onItemLongClickListener;
    }

    public abstract VH onCreateCustomViewHolder(View view);

    public abstract void onBindCustomViewHolder(VH vh, T t);

    @NonNull
    @Override
    public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
        return onCreateCustomViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull VH holder, int position) {
        onBindCustomViewHolder(holder, list.get(position));
    }

    @Override
    public int getItemCount() {
        return list != null ? list.size() : 0;
    }

    public abstract class CustomBaseHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {

        private static final int CLICK_EVENT_TIME = 600;

        private long lastClickTime;

        public CustomBaseHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
            itemView.setOnLongClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (onItemClickListener != null) {
                long currentTime = System.currentTimeMillis();
                if (currentTime - lastClickTime >= CLICK_EVENT_TIME) {
                    onItemClickListener.onItemClick(v, list.get(getAdapterPosition()));
                }
                lastClickTime = currentTime;
            }
        }

        @Override
        public boolean onLongClick(View v) {
            if (onItemLongClickListener != null) {
                onItemLongClickListener.onItemLongClick(v, list.get(getAdapterPosition()));
            }
            return false;
        }
    }

}

二、使用自定義抽象類,定義需求Adapter

  1. xml布局,adapter_item_text
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center">

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>
</RelativeLayout>
  1. 繼承抽象類
import android.view.View;
import android.widget.TextView;

import java.util.List;

public class DefaultStringAdapter extends CustomBaseAdapter<String, DefaultStringAdapter.DefaultStringHolder> {

    public DefaultStringAdapter(int layoutResId, List<String> list) {
        super(layoutResId, list);
    }

    @Override
    public DefaultStringHolder onCreateCustomViewHolder(View view) {
        return new DefaultStringHolder(view);
    }

    @Override
    public void onBindCustomViewHolder(DefaultStringHolder defaultStringHolder, String s) {
        defaultStringHolder.textView.setText(s);
    }

    public class DefaultStringHolder extends CustomBaseAdapter.CustomBaseHolder {
        private TextView textView;

        public DefaultStringHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.tv_content);
        }
    }

}

三、使用Adapter

        List<String> list = new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            list.add("item" + i);
        }

        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        DefaultStringAdapter adapter = new DefaultStringAdapter(R.layout.adapter_item_text, list);
        recyclerView.setAdapter(adapter);

        adapter.setOnItemClickListener(new CustomBaseAdapter.OnItemClickListener<String>() {
            @Override
            public void onItemClick(View view, String s) {
                Log.d("111", "onItemClick: " + s);
            }
        });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容