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的地址

时间: 2024-10-08 04:12:37

RecyclerView onItemClick button和布局都有单击事件时的处理方式的相关文章

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

RecyclerView为了给开发者提供更大的自由度,没有默认的提供onItemClick接口. 网上有一种比较简单的实现方式 , 适用于不需要针对item里面某个按钮做特殊处理的情况 我目前项目的需求是, 1.单击item,跳转到用户信息页. 2.单击加关注按钮,更改按钮状态. adapter代码如下 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.BaseViewHolder> { private List<

RecyclerView的Item的单击事件

显示效果 RecyclerView 的每个Item的点击事件并没有像ListView一样封装在组件中,需要Item的单击事件时就需要自己去实现,在Adapter中为RecyclerView添加单击事件参考如下: RecyclerView的使用方法请参考:RecyclerView的简单使用 第一步: 在RecyclerView的Adapyer中定义单击事件的回调接口: /** * 定义RecyclerView选项单击事件的回调接口 */ public interface OnItemClickLi

Android学习:单击事件onClickListener

一:看程序 二:总结    单击事件onClickListener三种方式: (1)动态设置方式            button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "我是动态button", Toast.LENGTH_SHORT).show(); } }); (2)配置方式    

对于服务器控件asp:Button单击事件失效问题汇总

今天写了个弹出层内的导出,发现按钮的单击事件点击无效,于是查找了各种原因,尝试多种方法进行解决. 先来说下可能的原因吧. 1.按钮事件方法的名称是否准确无误 2.是否为客户端按钮,即含有 runat="sever"标签. 3.按钮是否存在在<form runat="server">标签内. 4.检查是否按钮存在在被嵌套的form标签内..net 不允许form被嵌套. 5.还有一些其他不知道的限制因素.以后再补充吧.. 上面前四种情况,从文字上就能知道解

button单击事件的四种写法

Button单击事件的四种写法:  1.第一种写法:匿名内部类 附上代码: public class MainActivity extends Activity{ private Button btn ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (B

Button单击事件

今天研究了一下如何写最基本的Android程序,为Button添加单击等事件.自己在动手的时候确实遇到了很多问题,同时自己从上午的零基础的状态,到下午做出来一个成品app,还是挺兴奋滴~尤其是里面的控件,自己看说明或者网上查资料使用,逐步探索的过程~ 下面记录一下Button单击事件~ public class MainActivity extends Activity { Button myButton; TextView myTextView; @SuppressLint("SetJavaS

Android的按钮单击事件及监听器的实现方式

第一种:匿名内部类作为事件监听器类 第二种:内部类作为监听器 第三种:Activity本身作为事件监听器 第四种:外部类作为监听器 当用户单击button按钮时,程序将会触发MyButtonListener监听器外部MyButtonListener类 使用顶级类定义事件监听器类的形式比较少见,主要因为如下两个原因:1.事件监听器通常属于特定的gui界面,定义成外部类不篮球提高程序的内聚性.2.外部类形式的事件监听器不能自由访问创建gui界面的类中的组件,编程不够简洁.但如果某个事件监听器确实需要

.Net程序员玩转Android开发---(13)ListView单击事件

大家都知道ListView用来显示数据列表,每一个列表都有列表项组成,如果我们单击选中一个列表,想获取列表中的详细信息或者打开一个新窗口把列表信息传递过去怎么办那?这一节我们演示一下ListView的单击事件,通过这节我们会对ListVIEW有更深入的理解,先看下效果图 下面看下演示代码 主布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="ht

android v7兼容包RecyclerView的使用(四)——点击事件的不同方式处理

前三篇文章 android v7兼容包RecyclerView的使用(三)--布局管理器的使用 android v7兼容包RecyclerView的使用(二) android v7兼容包RecyclerView的使用(一) 介绍了RecyclerView的使用以及常见的相关类和布局管理器的灵活之处.写了这么多篇,还没涉及到用户交互,那么怎么处理点击事件呢. 在RecyclerView中你会惊奇的发现,该类中并没有OnItemClickListener监听器监听我们的单击事件,也没有OnItemL