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;那人却在灯火阑珊处 开始 在之前的文章里陈述了一个观点——编程语言和语言没有区别 现看看我们日常生活中的代理…

[笔试训练](七)

目录 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…

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…

新药品注册分类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…

02.Scala简单演示

Scala创建对象的方法与Java有所不同 class可以直接传入形参&#xff1b; 形式为 变量名称&#xff1a;变量类型 逗号隔开 ** ** 方法定义也比较特殊 ** ** def方法名&#xff08;&#xff09;:返回值 { } 其中返回值Unit 等价于Java中的void

系统服务(22年国赛)—— 磁盘管理(压缩去重)

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; 系统服务&#xff08;22年国赛&#xff09;—— 磁盘管理(压缩&&去重)https://myweb.myskillstree.cn/90.html 目录 StorageSrv 安装并创建vdo 将…

多输入多输出 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机多输入多输出预测

多输入多输出 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机多输入多输出预测 目录 多输入多输出 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 Matlab实现WOA-LSSVM鲸鱼算法优化…

STL_vector源码剖析

STL vector STL2.91源码地址: https://github.com/lewischeng-ms/sgi-stl 侯捷老师用的是 2.91,不同版本的STL差异很大&#xff0c;靠后版本的STL用了太多typedef以及继承关系&#xff0c;导致可读性很差。 本文参考博客: https://blog.csdn.net/weixin_45389639/article/detai…

记账本React案例(Redux管理状态)

文章目录 整体架构流程 环境搭建 创建项目 技术细节 一、别名路径配置 1.路径解析配置&#xff08;webpack&#xff09; &#xff0c;将/解析为src/ 2.路径联想配置&#xff08;vsCode&#xff09;&#xff0c;使用vscode编辑器时&#xff0c;自动联想出来src文件夹下的…

python-excel自动化-openpyxl

openpyxl学习笔记 创建或打开表格存储和遍历数据设置单元格风格过滤器和排序更改工作表的背景颜色合并单元格冻结窗口数字格式公式图像图表条形图折线图散点图 创建或打开表格 # 创建 import datetime from openpyxl import Workbook # 实例化 wb Workbook() # 激活 work…

使用Excel生成sql脚本(insert/update/delete)

目录 前言 一、Excel文件脚本变量 二、操作示例 前言 在系统使用初期&#xff0c;存在某种原因&#xff0c;需要对数据库数据进行批量处理操作。往往都是通过制定Excel表格&#xff0c;通过Excel导入到数据库中&#xff0c;所以就弄一个excel生成sql的导入脚本&#xff0c;希…