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 onItemClick button和布局都有单击事件时的处理方式的更多相关文章
- RecyclerView的Item的单击事件
RecyclerView 的每个Item的点击事件并没有像ListView一样封装在组件中,需要Item的单击事件时就需要自己去实现,在Adapter中为RecyclerView添加单击事件参考如下: ...
- RecyclerView 的 Item 的单击事件
RecyclerView 的每个Item的点击事件并没有像 ListView 一样封装在组件中,需要 Item 的单击事件时就需要自己去实现,在 Adapter 中为RecyclerView 添加单击 ...
- ListView中嵌入布局的Button或多个点击事件
有时候在ListView嵌入的布局中有多个事件需要点击,比如一个item中有TextView和Button两个布局,当我们需要获取这两个点击事件时,我们应该如何去获取呢,通常来说,我们都是已经固定好了 ...
- 一个滑动选中RecyclerView中Item的布局SlidingCheckLayout,手指滑过Item时多项选中。
SlidingCheckLayout是一个滑动选中RecyclerView中Item的布局,手指滑过Item时多项选中. 作者:竹尘居士 github:https://github.com/homgw ...
- android 开发 RecyclerView 横排列列表布局
1.写一个一竖的自定义布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xml ...
- 对于多个button要在同一个监听器中实现自己的单击事件的方法小诀窍。
在网上的一些教程中往往是把一个button加入多个监听器,却非常少有人会把多个button在同一个监听器中去实现他们的单击事件,并且这杨的事实上是非常有用的,比方说在制作一个简单的计算器是就须要0-9 ...
- Android的按钮单击事件及监听器四种常见的实现方式
第一种:匿名内部类作为事件监听器类<ignore_js_op>大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以 ...
- android v7兼容包RecyclerView的使用(四)——点击事件的不同方式处理
前三篇文章 android v7兼容包RecyclerView的使用(三)--布局管理器的使用 android v7兼容包RecyclerView的使用(二) android v7兼容包Recycle ...
- xamarin android如何监听单击事件
在xamarin android单击事件是最基础的事情,看过菜鸟上的android教程时,java写的都是监听事件,为一个按钮,单选按钮.多选按钮的单击事件有三种,前面两种用的非常普遍,也很简易,我这 ...
随机推荐
- python 学习分享-基础篇
1.python起手式 写下第一个代码,打印‘hello world’ print('hello world') 2.变量 变量是为了存储信息,在程序中被调用,标识数据名称或类型. 变量定义的规则: ...
- PHP全栈开发
DAY01_PHP基础第一天 01.了解php 00:09:26 ★ 02.php的开发环境准备 00:13:47 ★ 03.人人都会编程 00:10:26 ...
- python 时间、日期、时间戳的转换
在实际开发中经常遇到时间格式的转换,例如: 前端传递的时间格式是字符串格式,我们需要将其转换为时间戳,或者前台传递的时间格式和我们数据库中的格式不对应,我们需要对其进行转换才能与数据库的时间进行匹配等 ...
- Wannafly模拟赛3
喜欢想飞啊,毕竟这里的题目还都算挺好的中文题,不过做英文题久了还是感觉英文题更好理解一点 反蝴蝶效应 时间限制:1秒 空间限制:65536K 题目描述 一只南美洲亚马孙河流域热带雨林中的蝴蝶,偶尔扇动 ...
- javascript学习笔记 - 引用类型 RegExp
四 RegExp 格式: var expression = / pattern / flags; 1.flags 为标志.分别为g.i.m. g:表示全局模式.即模式将匹配所有的字符串,而不是在发现第 ...
- 解决webstorm安装babel卡死问题
2017.07.16 现在大家可以直接使用yarn的方式安装包,可以解决babel目录过长导致webstorm卡死的问题. yarn的安装不会执行组件命令就不会导致node_modules下面继续嵌套 ...
- python ConfigParser 的小技巧
$ cat format.conf [DEFAULT] conn_str = %(dbn)s://%(user)s:%(pw)s@%(host)s:%(port)s/%(db)s dbn = mysq ...
- [CF888G] Xor-mst (Trie 树,最小生成树)
题目链接 Solution \(Trie\) 树 + 启发式合并. 考虑到是异或,于是按位贪心.让高位的尽量相同. 然后要计算每棵子树的代价,似乎并没有很好的方法?? 于是只能启发式合并. 对于每一个 ...
- 【2018.12.17】NOI模拟赛4
题目 WZJ题解 T1 T2 T3 后缀自动机+($parents$ 树)树链剖分 发现有大量子串需要考虑,考虑摁死子串的一端. 首先,这题显然是一道离线题,因为所有的询问都是 $1$ 到 某个数,也 ...
- bzoj 1758 [Wc2010]重建计划 分数规划+树分治单调队列check
[Wc2010]重建计划 Time Limit: 40 Sec Memory Limit: 162 MBSubmit: 4345 Solved: 1054[Submit][Status][Disc ...