RecyclerView onItemClick 按鈕和佈局都有單擊事件時的處理方式

RecyclerView爲了給開發者提供更大的自由度,沒有默認的提供onItemClick接口。


網上有一種比較簡單的實現方式 , 適用於不需要針對item裏面某個按鈕做特殊處理的情況


我目前項目的需求是,

1.單擊item,跳轉到用戶信息頁。

2.單擊加關注按鈕,更改按鈕狀態。



adapter代碼如下


public class MyAdapter extends RecyclerView.Adapter<MyAdapter.BaseViewHolder> {

    private List<User> mList;  //用戶列表
    private Context mContext;  

    public PraisedAdapter(Context context,List<User> list){
        mContext = context;
        this.mList = list;
    }

    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View itemView = LayoutInflater.from(viewGroup.getContext()).
                inflate(R.layout.adapter_test, viewGroup, false);

        return new BaseViewHolder(itemView, new IMyViewHolderClicks() {
            @Override
            public void onItemClick(String uid) {
                // 跳轉到個人信息頁,根據uid獲取個人信息
           }

           //如果需要刷新某個特定界面,則參數中包含position
            @Override
            public void onFollowStatusChange(final User user,final int position) {
                //與服務器交互,如果成功,刷新當前按鈕文字的 "關注"爲"已關注"                 
                notifyItemChanged(position);

            }
        });
    }

    @Override
    public void onBindViewHolder(final BaseViewHolder baseViewHolder,final int position) {

        User user = mList.get(position);
        baseViewHolder.bind(user);
    }


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

    public class BaseViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        TextView tvFollowStatus;        //關注按鈕
        LinearLayout linearContainer;   //整個item的根佈局
        IMyViewHolderClicks mListener;

        public BaseViewHolder(View v,IMyViewHolderClicks listener) {
            super(v);
            tvFollowStatus = (TextView)v.findViewById(R.id.tv_follow_status);
            linearContainer = (LinearLayout)v.findViewById(R.id.linear_container);
            mListener = listener;
            tvFollowStatus.setOnClickListener(this);
            linearContainer.setOnClickListener(this);
        }

        public void bind(User user) {
            if(user.getIs_attention()==1){
                tvFollowStatus.setText("已關注");
            }else{
                tvFollowStatus.setText("加關注");
            }
          //將實體綁定到view上面
            tvFollowStatus.setTag(user);
            tvFollowStatus.setClickable(true);
        }

        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.tv_follow_status:
                    tvFollowStatus.setClickable(false);
                    mListener.onFollowStatusChange((User) tvFollowStatus.getTag(),getLayoutPosition());
                    break;
                case R.id.linear_container:
                    mListener.onItemClick(((User)tvFollowStatus.getTag()).getId());
                    break;
            }
        }
    }

    private interface IMyViewHolderClicks{
      //單擊整個item跳轉到用戶界面,需要傳遞uid
        public void onItemClick(String uid);
      //關注按鈕,需要更新按鈕的狀態
        public void onFollowStatusChange(User user,int position);
    }
}

以前在經常在綁定數據(bindViewHolder)中加入setOnClickListener(new View.OnClickListener),這樣每次都創建會很影響效率。


附上一篇詳細介紹RecyclerView的地址



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章