Android Studio初学者实例:RecyclerView学习--模仿今日头条

本案例来自于学校的一个简单的课程实验

先看效果图,可以显然的看到,一些item是不同的布局,而其他布局就是简单的布局嵌套

看一下xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:orientation="vertical"android:background="@color/light_gray_color"android:layout_height="match_parent"android:theme="@style/Theme.AppCompat.NoActionBar"tools:context=".MainActivity40">
<include layout="@layout/title_bar"/><LinearLayoutandroid:orientation="horizontal"android:layout_width="match_parent"android:layout_height="40dp"android:background="@color/white"><TextViewstyle="@style/tvStyle"android:text="推荐"android:textColor="#000000"/><TextViewstyle="@style/tvStyle"android:text="热点"android:textColor="#000000"/><TextViewstyle="@style/tvStyle"android:text="视频"android:textColor="#000000"/><TextViewstyle="@style/tvStyle"android:text="北京"android:textColor="#000000"/><TextViewstyle="@style/tvStyle"android:text="热点"android:textColor="#000000"/><TextViewstyle="@style/tvStyle"android:text="娱乐"android:textColor="#000000"/></LinearLayout><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#eeeeee"/><androidx.recyclerview.widget.RecyclerViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/rv_list"/>
</LinearLayout>

 XML代码中部分重复样式写入到了style文件中

看一下加入style.xm的代码,这个文件是存放在value文件夹下,存放样式、主题等。

<style name="tvStyle"><item name="android:layout_width">wrap_content</item><item name="android:layout_height">match_parent</item><item name="android:padding">10dp</item><item name="android:gravity">center</item><item name="android:textSize">15sp</item></style>

看一下Activity的Java代码

使用数组存放标题、内容、时间、图片等数据(因为现在还只是死数据)

setDate(单词拼错了!) 该函数,就是将数据填充到NewsList(一个泛型List)中

然后就是new一个自己声明的一个自定义适配器,使用Listview的setAdapter方法设置其适配器

public class MainActivity40 extends AppCompatActivity {
private  String[] titles={"各地餐企齐行动,杜绝餐饮浪费","花菜有人焯水,有人直接炒,都错了,看饭店大厨如何做","睡觉时,双脚突然蹬一下,有踩空感,像从高楼坠落,是咋回事?","实拍外卖小哥砸开小吃店的卷帘门救火,灭火后淡定决定继续送外卖","还没成熟就被迫提前采摘,8毛一斤却没人要,果农无奈,不摘不行","大会、大展、大赛一起来,北京电竞“好嗨哟”"};
private String[] names={"央视新闻客户端","味美食记","民富康健康","生活小记","禾木报告","燕鸣"};
private String[] comments={"1234评","14214评","534评","134评","1353评","876评"};
private String[]times={"刚刚","6小时前","8小时前","2小时前","刚刚","4小时前"};
private  int[] icons1={R.drawable.food,R.drawable.takeout,R.drawable.e_sports};
private int[] icons2={R.drawable.sleep1,R.drawable.sleep2,R.drawable.sleep3,R.drawable.fruit1,R.drawable.fruit2,R.drawable.fruit3};
private int[] types={1,1,2,1,2,1};
private RecyclerView mRecyclerView;
private myAdapter myAdapter;
private List<NewsBean> NewsList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main40);setDate();mRecyclerView=findViewById(R.id.rv_list);mRecyclerView.setLayoutManager(new LinearLayoutManager(this));myAdapter=new myAdapter(MainActivity40.this,NewsList);mRecyclerView.setAdapter(myAdapter);}private void setDate(){NewsList=new ArrayList<NewsBean>();NewsBean bean;for (int i = 0; i < titles.length; i++) {bean=new NewsBean();bean.setId(i+1);bean.setTitle(titles[i]);bean.setName(names[i]);bean.setComment(comments[i]);bean.setTime(times[i]);bean.setType(types[i]);switch (i){case 0:List<Integer> imgList0=new ArrayList<>();bean.setImgList(imgList0);break;case 1:List<Integer> imgList1=new ArrayList<>();imgList1.add(icons1[i-1]);bean.setImgList(imgList1);break;case 2:List<Integer> imgList2=new ArrayList<>();imgList2.add(icons2[i-2]);imgList2.add(icons2[i-1]);imgList2.add(icons2[i]);bean.setImgList(imgList2);break;case 3:List<Integer> imgList3=new ArrayList<>();imgList3.add(icons1[i-2]);bean.setImgList(imgList3);break;case 4:List<Integer> imgList4=new ArrayList<>();imgList4.add(icons2[i-1]);imgList4.add(icons2[i]);imgList4.add(icons2[i+1]);bean.setImgList(imgList4);break;case 5:List<Integer> imgList5=new ArrayList<>();imgList5.add(icons1[i-3]);bean.setImgList(imgList5);break;}NewsList.add(bean);}}}

其中涉及到了适配器,话不多说,上适配器代码,适配器是连接数据与Listview的一个“桥梁”

RecyclerView与ListView的适配器其实共同特征有很多。

在自定义的适配器中,首先是一个构造方法,来获取当前上下文以及数据列表

class myAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{private Context mContext;private List<NewsBean> NewsList;public myAdapter(Context context, List<NewsBean> list){this.mContext=context;this.NewsList=list;}@NonNull@NotNull@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {View itemView=null;RecyclerView.ViewHolder holder=null;if(viewType==1){itemView= LayoutInflater.from(mContext).inflate(R.layout.list_item_one,parent,false);holder=new ViewHolder1(itemView);}else  if(viewType==2){itemView= LayoutInflater.from(mContext).inflate(R.layout.list_item_two,parent,false);holder=new ViewHolder2(itemView);}return holder;}@Overridepublic int getItemViewType(int position) {return  NewsList.get(position).getType();}@Overridepublic void onBindViewHolder(@NonNull @NotNull RecyclerView.ViewHolder holder, int position) {NewsBean bean=NewsList.get(position);if(holder instanceof ViewHolder1){if(position==0){((ViewHolder1)holder).iv_top.setVisibility(View.VISIBLE);((ViewHolder1)holder).iv_img.setVisibility(View.GONE);}else {((ViewHolder1)holder).iv_top.setVisibility(View.GONE);((ViewHolder1)holder).iv_img.setVisibility(View.VISIBLE);}((ViewHolder1)holder).title.setText(bean.getTitle());((ViewHolder1)holder).name.setText(bean.getName());((ViewHolder1)holder).comment.setText(bean.getComment());((ViewHolder1)holder).time.setText(bean.getTime());if (bean.getImgList().size()==0)return;((ViewHolder1)holder).iv_img.setImageResource(bean.getImgList().get(0));}else  if(holder instanceof ViewHolder2){((ViewHolder2) holder).title.setText(bean.getTitle());((ViewHolder2) holder).name.setText(bean.getName());((ViewHolder2) holder).comment.setText(bean.getComment());((ViewHolder2) holder).time.setText(bean.getTime());((ViewHolder2) holder).iv_img1.setImageResource(bean.getImgList().get(0));((ViewHolder2) holder).iv_img2.setImageResource(bean.getImgList().get(1));((ViewHolder2) holder).iv_img3.setImageResource(bean.getImgList().get(2));}}@Overridepublic int getItemCount() {return NewsList.size();}class  ViewHolder1 extends RecyclerView.ViewHolder {ImageView iv_top,iv_img;TextView title,name,comment,time;public ViewHolder1(@NonNull @NotNull View itemView) {super(itemView);iv_top=itemView.findViewById(R.id.iv_top);iv_img=itemView.findViewById(R.id.iv_img);title=itemView.findViewById(R.id.tv_title);name=itemView.findViewById(R.id.tv_name);comment=itemView.findViewById(R.id.tv_comment);time=itemView.findViewById(R.id.tv_time);}}class  ViewHolder2 extends RecyclerView.ViewHolder {ImageView iv_img1,iv_img2,iv_img3;TextView title,name,comment,time;public ViewHolder2(@NonNull @NotNull View itemView) {super(itemView);iv_img1=itemView.findViewById(R.id.iv_img1);iv_img2=itemView.findViewById(R.id.iv_img2);iv_img3=itemView.findViewById(R.id.iv_img3);title=itemView.findViewById(R.id.tv_title);name=itemView.findViewById(R.id.tv_name);comment=itemView.findViewById(R.id.tv_comment);time=itemView.findViewById(R.id.tv_time);}}}

代码解说将会在后续补充

5-3   现在补充一下 list_item_one.xml与list_item_two.xml,这两个布局文件是Listview中两个item

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="90dp"android:layout_marginBottom="8dp"android:background="@color/white"android:padding="8dp"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/ll_info"android:orientation="vertical"><TextViewandroid:layout_width="280dp"android:layout_height="wrap_content"android:id="@+id/tv_title"android:maxLines="2"android:textColor="#3c3c3c"android:textSize="16sp"/><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:layout_width="20dp"android:layout_height="20dp"android:id="@+id/iv_top"android:layout_alignParentBottom="true"android:src="@drawable/aplle"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_toRightOf="@+id/iv_top"android:orientation="horizontal"><TextViewstyle="@style/tvInfo"android:id="@+id/tv_name"/><TextViewandroid:id="@+id/tv_comment"style="@style/tvInfo"/><TextViewandroid:id="@+id/tv_time"style="@style/tvInfo"/></LinearLayout></RelativeLayout></LinearLayout>
<ImageViewandroid:layout_width="match_parent"android:layout_height="90dp"android:id="@+id/iv_img"android:layout_toRightOf="@id/ll_info"android:padding="3dp"/>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="8dp"android:background="@color/white"android:padding="8dp"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/tv_title"android:maxLines="2"android:padding="8dp"android:textColor="#3c3c3c"android:textSize="16sp"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/ll_img"android:layout_below="@id/tv_title"android:orientation="horizontal"><ImageViewandroid:id="@+id/iv_img1"style="@style/ivImg"/><ImageViewandroid:id="@+id/iv_img2"style="@style/ivImg"/><ImageViewandroid:id="@+id/iv_img3"style="@style/ivImg"/></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/ll_img"android:orientation="vertical"android:padding="8dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_name"style="@style/tvInfo"/><TextViewandroid:id="@+id/tv_comment"style="@style/tvInfo"/><TextViewandroid:id="@+id/tv_time"style="@style/tvInfo"/></LinearLayout></LinearLayout>
</RelativeLayout>

补充一下NewBean  其实就是个实体类啦  其中get、set方法以及构造方法可以快速生成

import java.util.List;public class NewsBean {private  int id;private String title;private List<Integer> imgList;private String name;private String comment;private String time;private int type;public NewsBean() {}public NewsBean(int id, String title, List<Integer> imgList, String name, String comment, String time, int type) {this.id = id;this.title = title;this.imgList = imgList;this.name = name;this.comment = comment;this.time = time;this.type = type;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public List<Integer> getImgList() {return imgList;}public void setImgList(List<Integer> imgList) {this.imgList = imgList;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getComment() {return comment;}public void setComment(String comment) {this.comment = comment;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}public int getType() {return type;}public void setType(int type) {this.type = type;}
}

6-26补充一下使用的顶部布局

在res/layout下创建title_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:orientation="horizontal"android:paddingLeft="10dp"android:background="#d33d3c"android:paddingRight="10dp"android:layout_height="50dp">
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="今日头条"android:textColor="@color/white"android:textSize="22sp"/><EditTextandroid:layout_width="match_parent"android:layout_height="35dp"android:layout_gravity="center_vertical"android:layout_marginStart="15dp"android:layout_marginLeft="5dp"android:layout_marginRight="15dp"android:gravity="center_vertical"android:textColor="@color/black"android:hint="搜索"android:textColorHint="@color/gray_color"android:paddingLeft="30dp"/>
</LinearLayout>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/3764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抽象的代理模式1.0版本

前言&#xff1a; 在阅读Spring Security官方文档时&#xff0c;里面设计到了一种设计模式——代理模式Proxy 众里寻她千百度&#xff0c;蓦然回首&#xff0c;那人却在灯火阑珊处 开始 在之前的文章里陈述了一个观点——编程语言和语言没有区别 现看看我们日常生活中的代理…

力扣爆刷第128天之动态规划五连刷(一个零、零钱兑换、组合)

力扣爆刷第128天之动态规划五连刷&#xff08;一个零、零钱兑换、组合&#xff09; 文章目录 力扣爆刷第128天之动态规划五连刷&#xff08;一个零、零钱兑换、组合&#xff09;终结背包问题&#xff1a;这篇文章和上一篇。动态规划解题步骤&#xff1a;背包问题总结一、474. 一…

垃圾分类子项目三 - 添加oled显示

本文继承自: 垃圾分类子项目2 - 加入舵机控制-CSDN博客 添加 oled 功能: 我们要使用oled&#xff0c;就需要添加 i2c 功能 需要在这个文件中 /boot/orangepiEnv.txt 添加这行&#xff0c;使用 i2c 协议overlaysuart5 i2c3 myoled.c #include <errno.h> #include…

第十五届蓝桥杯C/C++B组题解

第十五届蓝桥杯大赛软件类省赛C/C大学B组 赛题链接A握手问题B小球反弹C好数DR格式E宝石组合F数字接龙G爬山H拔河

[笔试训练](七)

目录 019&#xff1a;字符串中找出连续最长的数字串 020&#xff1a;岛屿数量 021&#xff1a;拼三角 019&#xff1a;字符串中找出连续最长的数字串 字符串中找出连续最长的数字串_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 边遍历边记下遇到的…

ionic 中对Input输入框、searchbar进行solr检索

一、概述 Ionic 是一个用于开发跨平台应用程序的开源工具&#xff0c;可以使用 Angular、React 或 Vue 等前端框架。要在 Ionic 应用程序中实现实时与 Solr 通信&#xff0c;可以使用 HTTP 客户端&#xff08;如 Angular 的 HttpClient 或 Ionic 的 Native HTTP&#xff09;…

鸿蒙入门11-DataPanel组件

数据面板组件 用于将多个数据的占比情况使用 占比图 进行展示 参数 参数形式 &#xff1a; DataPanel( options:{ values: number[], max?: number, type?: DataPanelType } ) 参数名 参数类型 是否必填 默认值 参数描述 values number[] 是 - 数据值列表 最大支持…

Feign功能详解、使用步骤、代码案例

简介&#xff1a;Feign是Netflix开发的声明式&#xff0c;模板化的HTTP客户端&#xff0c;简化了HTTP的远程服务的开发。Feign是在RestTemplate和Ribbon的基础上进一步封装&#xff0c;使用RestTemplate实现Http调用&#xff0c;使用Ribbon实现负载均衡。我们可以看成 Feign R…

IDEA快速入门

目录 1. 概述 2. 安装 3. 激活 4. 关闭自动更新 5. 创建Java项目 5.1 配置JRE 5.2 创建项目 6. 配置设置 6.1 主题 6.2 设置字体默认大小 6.3 鼠标滚轮改变字体大小 6.4 设置自动导入 6.5 项目选择 7. lombok插件 7.1 安装插件 7.2 启用注解 8. 安装包及插件…

linux-进程(2)

1.通过系统调用获取进程标示符 进程id&#xff08;PID&#xff09; 父进程id&#xff08;PPID&#xff09; 每一个可执行程序运行起来之后都会成为一个进程&#xff0c;每个进程都有一个自己的id&#xff0c;以及一个父进程id&#xff0c;父进程就是创建自己进程的进程&#xf…

一条龙-T检验+绘制boxplot

1.输入文件&#xff1a; 2.代码 #title:boxplot-5utr-cds-3tr-ATCG的百分比分布和T检验_封装函数版 rm(listls(allTRUE)) setwd("E:/R/Rscripts/5UTR_ABD_TE") library(tidyverse) library(ggplot2) # library(RColorBrewer) library(patchwork) library(dplyr) l…

windows文件夹共享设置

目录 操作如何在同个局域网下的两个主机间分享文件?(尤其是在虚拟机与物理机中) 待续、更新中 操作 如何在同个局域网下的两个主机间分享文件?(尤其是在虚拟机与物理机中) 主机A(被访问) 两个主机在一个局域网中/被访问主机位本地账户 —— 桌面新建文件夹 —— 右键设置共享…

【k8s】(七) kubernetes1.29.4离线部署之-部署网络插件

&#xff08;一&#xff09;kubernetes1.29.4离线部署之-安装文件准备 &#xff08;二&#xff09;kubernetes1.29.4离线部署之-镜像文件准备 &#xff08;三&#xff09;kubernetes1.29.4离线部署之-环境初始化 &#xff08;四&#xff09;kubernetes1.29.4离线部署之-组件安装…

Python-100-Days: Day01

Day01 Python简介 1.1989年Guido von Rossum在圣诞节之夜开始着手python语言编译器的编写。 2.1991年2月 Python v1 编译器诞生&#xff0c;使用C实现的&#xff0c;此时可以调用C的库函数。 3.1994年1月&#xff0c;Python v1.0 正式版发布。 4.2000年10月16日&#xff0…

【Docker】Docker 中不能使用 nvidia-smi

目录 1. 问题 2. 解决方法 1. 问题 在 docker 中执行 nvidia-smi 后报错&#xff1a; Failed to initialize NVML: Unknown Error这个错误表示不能成功初始化NVML(Nvidia Management Library)库来管理和监测Nvidia GPU。可能的原因和解决方法如下: 检查是否正确安装并加载了…

mediasoupWork中引入本地so库

文章目录 1. gyp官方一般修改2. 尝试修改1本篇是一个bug的记录,原自一次需求对mediasoup worker层的修改需要引入一个自己的库,但是只有so库,找不到源码无法使用静态库的方式通过修改.gyp连接到worker中; 对于.gyp中so库的引入网上很难找到对应的文档,所以按照ld连接库的方…

新药品注册分类5大类的注册标准

在医药行业的浩瀚海洋中&#xff0c;药品注册分类就如同一座明亮的航标灯&#xff0c;指引着每一款新药从实验室走向市场&#xff0c;从理论概念变成患者手中的生命希望。本文将深入探讨化学药、中药、生物药的药品注册分类标准&#xff0c;药品分类常见问题、以及如何高效查询…

linux系统-深入学习文件系统与日志分析

目录 一、inode于block inode于block概括inode的内容inode包含文件的元信息用stat命令可以查看某个文件的inode信息Linux系统文件三个主要的时间属性目录文件架构 用户通过文件名打开文件时&#xff0c;系统内部的过程查看inode号码的实操硬盘分区后的结构 &#x1f447;用户访…

走向大规模应用之前,DePIN 如何突破技术、数据与市场之网

近期&#xff0c;随着分布式物理基础设施网络&#xff08;DePIN&#xff09;的快速演变&#xff0c;一个旨在利用区块链技术彻底改造传统基础设施模型的新兴生态系统正在逐渐浮现。2024 年 4 月&#xff0c;以 peaq 为代表的 DePIN 项目成功筹集了 1500 万美元用于生态系统的扩…

mac配置maven

在 macOS 上配置 Maven 也相对简单。以下是一种常用的方法&#xff1a; 1. 安装maven **下载 Maven&#xff1a;**首先&#xff0c;你需要从 Maven 官网&#xff08;https://maven.apache.org/download.cgi&#xff09;下载最新版本的 Maven。你可以选择二进制压缩包&#xf…