热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android(8)RecyclerView适配器实现多布局item+item内部控件点击事件

先看看效果是不是自己想要的吧item及item内部控件点击事件不懂的可以先点击查看

@先看看效果是不是自己想要的吧@

 

&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;>item及item内部控件点击事件不懂的可以先点击查看<&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;

 

使用步骤&#xff1a;

第一步&#xff1a;添加RecyclerView适配器依赖

compile &#39;com.android.support:recyclerview-v7:27.1.1&#39;

第二步&#xff1a;布局文件里使用RecyclerView

第三步&#xff1a;创建两个item子布局填充item内容

itemone.xml



itemtwo.xml


第四步&#xff1a;定义一个实体类Data&#xff0c;作为Recyclerview的适配类型

package com.ied.recyclerview.entity;public class Data {public static final int TYPE_ONE &#61; 1;//类型1public static final int TYPE_TWO &#61; 2;//类型2public int type;//item内容 类型public int icon;public String username;public String message;public Data(int type, int icon, String username, String message) {this.type &#61; type;this.icon &#61; icon;this.username &#61; username;this.message &#61; message;}public static int getTypeOne() {return TYPE_ONE;}public static int getTypeTwo() {return TYPE_TWO;}public int getType() {return type;}public void setType(int type) {this.type &#61; type;}public int getIcon() {return icon;}public void setIcon(int icon) {this.icon &#61; icon;}public String getUsername() {return username;}public void setUsername(String username) {this.username &#61; username;}public String getMessage() {return message;}public void setMessage(String message) {this.message &#61; message;}
}

第五步&#xff1a;创建自定义MyRecyclerViewAdapter适配器继承RecyclerView.Adapter

package com.ied.recyclerview.adapter;import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import com.ied.recyclerview.R;
import com.ied.recyclerview.entity.Data;
import java.util.List;public class MyRecyclerViewAdapter extends RecyclerView.Adapter{private List list;//数据源private Context context;//上下文public MyRecyclerViewAdapter(List list, Context context) {this.list &#61; list;this.context &#61; context;}&#64;NonNull&#64;Overridepublic RecyclerView.ViewHolder onCreateViewHolder(&#64;NonNull ViewGroup parent, int viewType) {//选择类型switch (viewType){case Data.TYPE_ONE:View view &#61; LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false);return new OneViewHolder(view);case Data.TYPE_TWO:view &#61; LayoutInflater.from(parent.getContext()).inflate(R.layout.itemtwo,parent,false);return new TwoViewHolder(view);}return null;}//绑定&#64;Overridepublic void onBindViewHolder(&#64;NonNull RecyclerView.ViewHolder holder, int position) {}//有多少个item&#xff1f;&#64;Overridepublic int getItemCount() {return list.size();}//item类型&#64;Overridepublic int getItemViewType(int position) {return list.get(position).type;}//&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;以下为item中的button控件点击事件处理&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;//第一步&#xff1a;自定义一个回调接口来实现Click和LongClick事件public interface OnItemClickListener {void onItemClick(View v, int position);void onItemLongClick(View v);}public OnItemClickListener mOnItemClickListener;//第二步&#xff1a;声明自定义的接口//第三步&#xff1a;定义方法并暴露给外面的调用者public void setOnItemClickListener(OnItemClickListener listener) {this.mOnItemClickListener &#61; listener;}
//&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;&#43;//第一个item类型class OneViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {private ImageView ivIcon;private TextView tvUsername, tvMessage;private Button btnAgree, btnRefuse;//private List list;public OneViewHolder(View itemView) {super(itemView);ivIcon &#61; itemView.findViewById(R.id.iv_icon);tvUsername &#61; itemView.findViewById(R.id.tv_username);tvMessage &#61; itemView.findViewById(R.id.tv_message);btnAgree &#61; itemView.findViewById(R.id.btn_agree);btnRefuse &#61; itemView.findViewById(R.id.btn_refuse);// 为item及item内部控件添加点击事件itemView.setOnClickListener(this);btnAgree.setOnClickListener(this);btnRefuse.setOnClickListener(this);}&#64;Overridepublic void onClick(View v) {if (mOnItemClickListener !&#61; null) {mOnItemClickListener.onItemClick(v, getAdapterPosition());}}}//第二个item类型class TwoViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {private ImageView ivIcon;private TextView tvUsername;public TwoViewHolder(View itemView) {super(itemView);ivIcon &#61; itemView.findViewById(R.id.iv_icon);tvUsername &#61; itemView.findViewById(R.id.tv_username);// 为item添加点击事件itemView.setOnClickListener(this);}&#64;Overridepublic void onClick(View v) {if (mOnItemClickListener !&#61; null) {mOnItemClickListener.onItemClick(v, getAdapterPosition());}}}}

 

第六步&#xff1a;在MainActivity中编写&#xff0c;初始化数据&#xff0c;设置适配器

 

package com.ied.recyclerview;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;
import com.ied.recyclerview.adapter.MyRecyclerViewAdapter;
import com.ied.recyclerview.entity.Data;
import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {private RecyclerView rvRecyclerView;private MyRecyclerViewAdapter adapter;private List list;&#64;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();rvRecyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));//控制布局为LinearLayout或者是GridView或者是瀑布流布局adapter &#61; new MyRecyclerViewAdapter(list,this);rvRecyclerView.setAdapter(adapter);// 设置item及item中控件的点击事件adapter.setOnItemClickListener(MyItemClickListener);}private void initView() {rvRecyclerView &#61; (RecyclerView) findViewById(R.id.rv_recyclerView);}private void initData() {list &#61; new ArrayList<>();list.add(new Data(1,R.mipmap.ic_launcher, "username", "让我们成为好友吧&#xff01;"));list.add(new Data(2,R.mipmap.ic_launcher, "username", "让我们成为好友吧&#xff01;"));list.add(new Data(1,R.mipmap.ic_launcher, "username", "让我们成为好友吧&#xff01;"));list.add(new Data(2,R.mipmap.ic_launcher, "username", "让我们成为好友吧&#xff01;"));list.add(new Data(1,R.mipmap.ic_launcher, "username", "让我们成为好友吧&#xff01;"));}/*** item&#xff0b;item里的控件点击监听事件*/private MyRecyclerViewAdapter.OnItemClickListener MyItemClickListener &#61; new MyRecyclerViewAdapter.OnItemClickListener() {&#64;Overridepublic void onItemClick(View v, int position) {switch (v.getId()){case R.id.btn_agree:Toast.makeText(MainActivity.this,"你点击了同意按钮"&#43;(position&#43;1),Toast.LENGTH_SHORT).show();break;case R.id.btn_refuse:Toast.makeText(MainActivity.this,"你点击了拒绝按钮"&#43;(position&#43;1),Toast.LENGTH_SHORT).show();break;default:Toast.makeText(MainActivity.this,"你点击了item按钮"&#43;(position&#43;1),Toast.LENGTH_SHORT).show();break;}}&#64;Overridepublic void onItemLongClick(View v) {}};}

最后成功实现多布局item及item内部控件的点击事件&#xff01;&#xff01;

 

 

 


推荐阅读
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
author-avatar
Yao2502880171
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有