• RecyclerView onItemClick button和布局都有单击事件时的处理方式


    RecyclerView为了给开发人员提供更大的自由度。没有默认的提供onItemClick接口。


    网上有一种比較简单的实现方式 , 适用于不须要针对item里面某个button做特殊处理的情况


    我眼下项目的需求是,

    1.单击item,跳转到用户信息页。

    2.单击加关注button,更改button状态。



    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) {
                    //与server交互,假设成功,刷新当前button文字的 "关注"为"已关注"                 
                    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;        //关注button
            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);
          //关注button,须要更新button的状态
            public void onFollowStatusChange(User user,int position);
        }
    }

    曾经在常常在绑定数据(bindViewHolder)中增加setOnClickListener(new View.OnClickListener),这样每次都创建会非常影响效率。


    附上一篇具体介绍RecyclerView的地址



  • 相关阅读:
    2009下半软考信息系统项目管理师,我又没通过。
    批量文件渲染
    Python Trick
    QThread basic
    一个简单的进度条
    js 基础知识回顾
    前端 知识笔记
    jquery 回顾
    Sass 回顾
    css
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6820465.html
Copyright © 2020-2023  润新知