簡體   English   中英

將Click偵聽器添加到Generic RecyclerView Adapter

[英]Add click listener to Generic RecyclerView Adapter

編輯

因為它是一個genericAdapter並不簡單,我知道添加點擊監聽器的方法。 onCreateViewHolder執行此操作並不是一個好習慣。 所以這就是為什么我需要一個更好的建議

我在android 為RecyclerView創建了一個通用適配器 現在我想要一些改進它的建議。 我怎么能添加clickListener。

GenericAdapter.java

public abstract class GenericAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context context;
    private ArrayList<T> items;
    private OnRecyclerItemClicked onRecyclerItemClicked;

    public abstract RecyclerView.ViewHolder setViewHolder(ViewGroup parent);

    public abstract void onBindData(RecyclerView.ViewHolder holder, T val);

    public GenericAdapter(Context context, ArrayList<T> items){
        this.context = context;
        this.items = items;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder holder = setViewHolder(parent);
        return holder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        onBindData(holder,items.get(position));
    }

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

    public void addItems( ArrayList<T> savedCardItemz){
        items = savedCardItemz;
        this.notifyDataSetChanged();
    }

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

    public void setOnRecyclerItemClicked(OnRecyclerItemClicked onRecyclerItemClicked){
        this.onRecyclerItemClicked = onRecyclerItemClicked;
    }

    public interface OnRecyclerItemClicked{
        void onItemClicked(View view,int position);
    }
}

並稱之為

adapter = new GenericAdapter<MyModelClass>(context,listOfModelClass) {
                @Override
                public RecyclerView.ViewHolder setViewHolder(ViewGroup parent) {
                    final View view = LayoutInflater.from(context).inflate(R.layout.item_recycler_view, parent, false);
                    AViewHolder viewHolder = new AViewHolder(context, view);
                    return viewHolder;
                }

                @Override
                public void onBindData(RecyclerView.ViewHolder holder1, MyModelClass val) {
                        MyModelClass currentCard = val;

                        AViewHolder holder = (AViewHolder)holder1;
                        holder.cardNumber.setText(currentCard.getDisplayNumber());
                        holder.cardHolderName.setText(currentCard.getCardHolderName());
                }
            };
            mRecyclerView.setAdapter(adapter);

現在我如何以及在哪里添加點擊監聽器。 向onBindData添加click偵聽器是一種開銷。 需要建議。

您是否嘗試過添加ViewHolder並將clicklistener添加到其中

現在GenericAdapter.java。

public abstract class GenericAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context context;
    private List<T> items;
    private OnRecyclerItemClicked onRecyclerItemClicked;

    public abstract RecyclerView.ViewHolder setViewHolder(ViewGroup parent , OnRecyclerItemClicked onRecyclerItemClicked);

    public abstract void onBindData(RecyclerView.ViewHolder holder, T val);

    public abstract OnRecyclerItemClicked onGetRecyclerItemClickListener();

    public GenericAdapter(Context context, List<T> items){
        this.context = context;
        this.items = items;
        onRecyclerItemClicked = onGetRecyclerItemClickListener();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder holder = setViewHolder(parent , onRecyclerItemClicked);
        return holder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        onBindData(holder,items.get(position));
    }

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

    public void setItems( ArrayList<T> savedCardItemz){
        items = savedCardItemz;
        this.notifyDataSetChanged();
    }

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

    public interface OnRecyclerItemClicked{
        void onItemClicked(View view,int position);
    }
}

並且這樣稱呼它

GenericAdapter<CreditCardItemBO> adaptering = new GenericAdapter<CreditCardItemBO>(mContext,new ArrayList<CreditCardItemBO>()) {
            @Override
            public RecyclerView.ViewHolder setViewHolder(ViewGroup parent, OnRecyclerItemClicked onRecyclerItemClicked) {
                final View view = LayoutInflater.from(mContext).inflate(R.layout.item_save_credit_card, parent, false);
                CreditCardViewHolder viewHolder = new CreditCardViewHolder(mContext, view,onRecyclerItemClicked);
                return viewHolder;
            }

            @Override
            public void onBindData(RecyclerView.ViewHolder holder, CreditCardItemBO val) {

            }

            @Override
            public OnRecyclerItemClicked onGetRecyclerItemClickListener() {
                return new OnRecyclerItemClicked() {
                    @Override
                    public void onItemClicked(View view, int position) {

                    }
                };
            }
        };

您可以在已聲明為RecyclerView的活動中添加偵聽器:

recyclerView.addOnItemTouchListener(new RecyclerTouchListener(this, recyclerView, 
   new RecyclerTouchListener.ClickListener() {
        @Override
        public void onClick(View view, int position) {
                //Handle the action
            }
        }

        @Override
        public void onLongClick(View view, int position) {

        }

    }));

我在Santa解決方案中實現了ViewHolder,如下所示:

public class EmployeeViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    private TextView employeeName;
    private BaseRecyclerAdapter.OnRecyclerItemClicked mOnRecyclerItemClicked;

    public EmployeeViewHolder(View view, BaseRecyclerAdapter.OnRecyclerItemClicked onRecyclerItemClicked) {
        super(view);
        employeeName = (TextView) view.findViewById(R.id.employee_name);
        mOnRecyclerItemClicked = onRecyclerItemClicked;
        view.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        mOnRecyclerItemClicked.onItemClicked(view, getAdapterPosition());
    }

    public TextView getEmployeeName() {
        return employeeName;
    }
}

如果您需要上下文,請將其作為參數添加到構造函數中。

我創建了一個通用適配器,aar和源代碼在這個url

它很容易使用:

RecyclerAdapter<Customer> mAdapter = new RecyclerAdapter(customerList, CustomerViewHolder.class);

添加附加偵聽器(lambda示例)

RecyclerItemClickListener.affectOnItemClick(mRecycler, (position, view1) -> { 
 //action
});

請參閱Url鏈接更多詳細信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM