1. 程式人生 > >android開發:給RecyclerView的item新增點選事件

android開發:給RecyclerView的item新增點選事件

RecyclerView可以實現更加好看的佈局,但是對於item點選事件的實現卻有些麻煩,這裡講的是我在看過各種資料和部落格後個人覺得最好用的兩種方法(其實說到底也只是一種方法),放在這裡可以給大家學習也算是自己的一種複習

方法一:

1、首先在adapter類外定義一個OnRecyclerItemClickListener的介面

public interface OnRecyclerItemClickListener {
   //RecyclerView的點選事件,將資訊回撥給view
    void onItemClick(int Position, List<IntegralMenu.DataBean> dataBeanList);
}

 2、接下來就是繫結監聽事件了,因為官方沒有提供點選的監聽,所以我們這個監聽方法就不能繫結在recyclerview物件上,因此,我們將這個步驟轉移到adapter中進行。

public class IntegralAdapter extends RecyclerView.Adapter<IntegralAdapter.ViewHolder> {

    private List<IntegralMenu.DataBean> mDataBeanList;

    //宣告自定義的監聽介面
    private OnRecyclerItemClickListener monItemClickListener;

    //提供set方法供Activity或Fragment呼叫
    public void setRecyclerItemClickListener(OnRecyclerItemClickListener listener){
        monItemClickListener=listener;
    }

     class ViewHolder extends RecyclerView.ViewHolder{

        TextView integralContent;
        TextView integralChange;
        TextView integralTime;

        public ViewHolder(View view){
            super(view);
            integralContent=view.findViewById(R.id.integral_content);
            integralChange=view.findViewById(R.id.change_integral);
            integralTime=view.findViewById(R.id.integral_time);
            //將監聽傳遞給自定義介面
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (monItemClickListener!=null){

                        monItemClickListener.onItemClick(getAdapterPosition(),mDataBeanList);
                    }
                }
            });
        }
    }
       ......

}

這裡只提供監聽事件的繫結方法,至於Adapter類中的其他方法,這裡就不寫了,相信大家都會。

其實方法一是我個人很喜歡的一個方法,這裡在定義的介面中傳入了具體的資料dataBeanList,方便資訊的處理和回撥,降低了程式碼的耦合性,可以把資料的處理放在一個單獨的方法中,有更清楚的邏輯,而且在程式碼出錯時更容易定位,這其實也是mvp模式的思想。

最後在Activity或Fragmen中的呼叫

 adapter.setRecyclerItemClickListener(new OnRecyclerItemClickListener() {
            @Override
            public void onItemClick(int Position, List<IntegralMenu.DataBean> dataBeanList) {
                //具體的操作邏輯
                mIntegralPresenter.onItemClick(Position,dataBeanList);
            }
        });

方法二:

方法二是我最早使用的方法,是直接把介面定義在Adapter方法中的,具體程式碼如下

public class IntegralAdapter extends RecyclerView.Adapter<IntegralAdapter.ViewHolder> implements View.OnClickListener {

    private List<Integral> mIntegralList;
    //定義介面
    public static interface OnItemClickListener {
        void onItemClick(View view,int position);
    }
   //宣告自定義的監聽介面
    private OnItemClickListener monItemClickListener=null;

   //提供set方法
    public void setonItemClickListener(OnItemClickListener listener){
        this.monItemClickListener=listener;
    }

    static class ViewHolder extends RecyclerView.ViewHolder{


        TextView integralContent;
        TextView integralChange;
        TextView integralTime;

        public ViewHolder(View view){
            super(view);
            integralContent=view.findViewById(R.id.integral_content);
            integralChange=view.findViewById(R.id.change_integral);
            integralTime=view.findViewById(R.id.integral_time);
        }
    }

    public IntegralAdapter(List<Integral> integralList){
        mIntegralList=integralList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_integral,parent,false);
        ViewHolder holder=new ViewHolder(view);
       //繫結監聽事件
        view.setOnClickListener(this);
        return  holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Integral integral=mIntegralList.get(position);
        holder.integralContent.setText(integral.getContent());
        if (integral.isType()==true){
            holder.integralChange.setSelected(true);
            holder.integralChange.setText("+"+integral.getChange());
        }else {
            holder.integralChange.setSelected(false);
            holder.integralChange.setText("-"+integral.getChange());
        }
        holder.integralTime.setText(integral.getTime());
        //將position儲存在itemView的Tag中,以便點選時進行獲取
        holder.itemView.setTag(position);
    }


    @Override
    public void onClick(View v) {
        if (mIntegralList!=null){
            //這裡使用getTag方法獲取position
            monItemClickListener.onItemClick(v,(int)v.getTag());
        }
    }


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

這裡就不做詳細講述了,和上面基本一樣

在Activity或Fragmen中的呼叫

adapter.setonItemClickListener(new OnItemClickListener() {
 
            @Override
            public void OnItemClick(View view, int postion) {
                //具體操作邏輯
            }
        });

這個方法與上面的方法相比,最大的不同就是自定義的監聽事件中沒有傳入具體的資料,如果需要對資料進行操作的話就只能在activity或fragment中進行,同時讀取資料的也就自熱而然由它們做了,這樣是不利於程式碼的維護的,當然在學習的時候這樣寫是可以的,方便理清楚邏輯。

第一次寫部落格,希望大家一起交流啊。