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

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

  1. RecyclerView的Item的单击事件

    RecyclerView 的每个Item的点击事件并没有像ListView一样封装在组件中,需要Item的单击事件时就需要自己去实现,在Adapter中为RecyclerView添加单击事件参考如下: ...

  2. RecyclerView 的 Item 的单击事件

    RecyclerView 的每个Item的点击事件并没有像 ListView 一样封装在组件中,需要 Item 的单击事件时就需要自己去实现,在 Adapter 中为RecyclerView 添加单击 ...

  3. ListView中嵌入布局的Button或多个点击事件

    有时候在ListView嵌入的布局中有多个事件需要点击,比如一个item中有TextView和Button两个布局,当我们需要获取这两个点击事件时,我们应该如何去获取呢,通常来说,我们都是已经固定好了 ...

  4. 一个滑动选中RecyclerView中Item的布局SlidingCheckLayout,手指滑过Item时多项选中。

    SlidingCheckLayout是一个滑动选中RecyclerView中Item的布局,手指滑过Item时多项选中. 作者:竹尘居士 github:https://github.com/homgw ...

  5. android 开发 RecyclerView 横排列列表布局

    1.写一个一竖的自定义布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xml ...

  6. 对于多个button要在同一个监听器中实现自己的单击事件的方法小诀窍。

    在网上的一些教程中往往是把一个button加入多个监听器,却非常少有人会把多个button在同一个监听器中去实现他们的单击事件,并且这杨的事实上是非常有用的,比方说在制作一个简单的计算器是就须要0-9 ...

  7. Android的按钮单击事件及监听器四种常见的实现方式

    第一种:匿名内部类作为事件监听器类<ignore_js_op>大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以 ...

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

    前三篇文章 android v7兼容包RecyclerView的使用(三)--布局管理器的使用 android v7兼容包RecyclerView的使用(二) android v7兼容包Recycle ...

  9. xamarin android如何监听单击事件

    在xamarin android单击事件是最基础的事情,看过菜鸟上的android教程时,java写的都是监听事件,为一个按钮,单选按钮.多选按钮的单击事件有三种,前面两种用的非常普遍,也很简易,我这 ...

随机推荐

  1. 自建NAS如何使用大于2TB的硬盘(从分区开始)

    目录 自建NAS如何使用大于2TB的硬盘(从分区开始) 对分区进行格式化 挂载到某一目录(需设置开机自动挂载) 上传文件测试: 补充 自建NAS如何使用大于2TB的硬盘(从分区开始) 需求说明: 自建 ...

  2. IDEA界面创建Scala的Maven项目

    1. 创建Maven工程,勾选右侧的Create from archetype选项,然后选中下方的scala-archetype-simple选项,如图所示:2. 填写相应的GroupId.Artif ...

  3. pip安装及使用

    1.pip下载安装 1.1 pip下载 # wget "https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5= ...

  4. Leetcode 451.根据字符出现频率排序

    根据字符出现频率排序 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入: "tree" 输出: "eert" 解释: 'e'出现两次 ...

  5. PTA 11-散列2 Hashing (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/679 5-17 Hashing   (25分) The task of this pro ...

  6. Key-value数据库:Redis缓存服务

    Redis 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.其提供了多种主流语言的客户端,方便使用:同时Redis支持主 ...

  7. 【Luogu】P4231三步必杀(差分,差分)

    题目链接 郑重宣布我以后真的再也不会信样例了,三种写法都能过 另:谁评的蓝题难度qwq 蓝题有这么恐怖吗 两次差分,第一次差分,前缀和求出增量数组,第二次求出原数组顺便更新答案 看题解之后……第二次差 ...

  8. 备忘 CSS字体中英文名称对照表

    转载自:http://www.jb51.net/css/67658.html 在CSS文件中,我们常看到有些字体名称变成了乱码,这是由于编写者将中文字体的名字直接写成了中文,并且再上传或者拷贝复制的时 ...

  9. HDU——1272小希的迷宫(并查集+拓扑排序)

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  10. [luoguP2761] 软件补丁问题(状压最短路)

    传送门 n <= 20 很小 所以可以状态压缩 然后因为可能存在环,所以不能DP 那么就用spfa找最短路 被位运算坑了,不清楚优先级一定要加括号 ——代码 #include <queue ...