当前位置: 首页 > news >正文

Android Studio实现解析HTML获取json,解析json图片URL,将URL存到list,进行瀑布流展示

目录

        • 效果
        • build.gradle(app)添加的依赖(用不上的可以不加)
        • AndroidManifest.xml
        • 错误
        • activity_main.xml
        • item_image.xml
        • MainActivity
        • Image适配器
        • ImageModel 接收图片URL

效果

在这里插入图片描述

build.gradle(app)添加的依赖(用不上的可以不加)

dependencies {implementation 'com.squareup.picasso:picasso:2.71828'implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.airbnb.android:lottie:3.0.3'implementation 'com.facebook.fresco:fresco:0.9.0+'implementation 'org.jsoup:jsoup:1.14.1'implementation 'com.squareup.okhttp3:okhttp:4.9.1'implementation 'com.github.bumptech.glide:glide:4.12.0'annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:+'implementation 'androidx.sqlite:sqlite:2.2.0'implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.google.code.gson:gson:2.8.9'implementation 'com.alibaba:fastjson:1.2.67'implementation("com.squareup.okhttp3:okhttp:4.10.0")}

AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <applicationandroid:usesCleartextTraffic="true">

错误

如果出现错误:app:checkDebugDuplicateClasses
参考这篇博客尝试解决

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent" /></RelativeLayout>

item_image.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:padding="5dp"><ImageViewandroid:id="@+id/imageView"android:layout_width="200dp"android:layout_height="200dp"android:scaleType="centerCrop"android:adjustViewBounds="true" /></LinearLayout>

MainActivity

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import android.os.Bundle;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class MainActivity extends AppCompatActivity {private RecyclerView mRecyclerView;private ImageAdapter mImageAdapter;public String html = "https://2k317b5009.goho.co/images/List?type=breakfast";private List<ImageModel> mImageUrlsList = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//使用单线程的线程池来异步执行 callable 对象中的任务,并在任务执行完成后获取结果并显示图片和进行其他操作//使用 ExecutorService 来执行一个 Callable 对象,并获取它的返回结果//创建一个单线程的线程池,用于执行任务ExecutorService executor = Executors.newSingleThreadExecutor();//将 callable 对象提交给线程池进行执行,并返回一个 Future 对象,该对象可以用于获取任务的执行结果Future<List<ImageModel>> future = executor.submit(callable);try {//通过调用 future.get() 方法来阻塞主线程,直到任务执行完成并返回结果。在这里,我们将返回的结果赋值给 imageUrls 变量List<ImageModel> imageUrls = future.get();//将获取到的图片列表传递给 showImages 方法,以显示图片和后续操作showImages(imageUrls);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();} catch (Exception e) {throw new RuntimeException(e);} finally {executor.shutdown();}}private void showImages(List<ImageModel> imageUrls) {LinearLayoutManager layoutManager = new LinearLayoutManager(this);mRecyclerView.setLayoutManager(layoutManager);mRecyclerView = findViewById(R.id.recyclerView);//通过设置RecyclerView的布局管理器为StaggeredGridLayoutManager,并指定每行或每列的单元格数量和布局方向,就可以实现错乱瀑布流的效果//spanCount:指定每行或每列的单元格数量。在这个例子中,设置为2,表示每行有两个单元格。//orientation:指定布局的方向,VERTICAL表示垂直mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));//自定义的适配器类 将数据绑定到RecyclerView中的每个列表项上ImageAdapter adapter = new ImageAdapter(imageUrls, this);//调用RecyclerView的setAdapter()方法,将适配器与RecyclerView关联mRecyclerView.setAdapter(adapter);}/*** 使用 java.util.concurrent 包来执行并发任务,可以通过创建 ExecutorService 和 Future 对象来实现* 在 onCreate() 方法中,我们创建了一个单线程的 ExecutorService,然后通过 submit() 方法将 HtmlParserTask 提交给线程池进行执行。* 接着,我们使用 future.get() 来获取并发任务的结果,并调用 showImages() 方法来展示图片*/Callable<List<ImageModel>> callable = new Callable<List<ImageModel>>() {@Overridepublic List<ImageModel> call() throws Exception {List<ImageModel> imageModels = new ArrayList<>();// 解析 HTML 获取图片 URL 的逻辑Document document = Jsoup.connect(html).get();//使用 Jsoup 连接到给定的 HTML 页面,并使用 body().text() 方法获取页面的纯文本内容String jsonString = document.body().text();//转换成objectJSONObject jsonObject = new JSONObject(jsonString);//从jsonObject里面找一个ImageList的对象JSONArray jsonArray = jsonObject.getJSONArray("ImageList");String imageUrl = null;//开始遍历for (int i = 0; i < jsonArray.length(); i++) {//遍历ImageList里面的每个对象JSONObject item = jsonArray.getJSONObject(i);// 检查是否存在 "src" 键if (item.has("src")) {imageUrl = item.getString("src");//Log.e(TAG,imageUrl);imageModels.add(new ImageModel(imageUrl));}}return imageModels;}};
}

Image适配器

import static android.content.ContentValues.TAG;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.squareup.picasso.Picasso;
import java.util.List;
import java.util.Random;//适配器类
public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageViewHolder> {private List<ImageModel> imageList;private Context context;//有参构造public ImageAdapter(List<ImageModel> imageList, Context context) {Log.e(TAG, "ImageAdapter thread id= "+ Thread.currentThread().getId() + " name="+Thread.currentThread().getName());this.imageList = imageList;this.context = context;}//onCreateViewHolder() 方法用于创建RecyclerView的每个列表项的视图@NonNull@Overridepublic ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(context).inflate(R.layout.item_image, parent, false);return new ImageViewHolder(view);}//onBindViewHolder() 方法用于将数据绑定到ViewHolder中的视图@Overridepublic void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {ImageModel imageModel = imageList.get(position);//获取特定位置的图像模型(ImageModel)对象,并从中获取图像URLString imageUrl = imageModel.getImageUrl();//使用Picasso库加载图像URL并显示在ViewHolder的ImageViewPicasso.get().load(imageUrl).fit().centerCrop().into(holder.imageView);// 设置图片的高度为随机高度,以实现错乱瀑布流效果ViewGroup.LayoutParams layoutParams = holder.imageView.getLayoutParams();layoutParams.height = getRandomHeight();//随机高度holder.imageView.setLayoutParams(layoutParams);}// 获取随机高度private int getRandomHeight() {Random random = new Random();return random.nextInt(400) + 300; // 设置图片高度范围为300-700之间的随机值}//返回图像列表的大小,即列表中包含的图像数量@Overridepublic int getItemCount() {return imageList.size();}//设置适配器的图像列表public void setImageList(List<ImageModel> imageList) {this.imageList = imageList;}public class ImageViewHolder extends RecyclerView.ViewHolder {ImageView imageView;//持有每个列表项的视图组件,这里是一个ImageViewpublic ImageViewHolder(@NonNull View itemView) {super(itemView);imageView = itemView.findViewById(R.id.imageView);}}
}

ImageModel 接收图片URL

//接收图片url
public class ImageModel {private String imageUrl;public ImageModel(String imageUrl) {this.imageUrl = imageUrl;}public void setImageUrl(String imageUrl) {this.imageUrl = imageUrl;}public String getImageUrl() {return imageUrl;}
}

相关文章:

Android Studio实现解析HTML获取json,解析json图片URL,将URL存到list,进行瀑布流展示

目录 效果build.gradle&#xff08;app&#xff09;添加的依赖&#xff08;用不上的可以不加&#xff09;AndroidManifest.xml错误activity_main.xmlitem_image.xmlMainActivityImage适配器ImageModel 接收图片URL 效果 build.gradle&#xff08;app&#xff09;添加的依赖&…...

Centos7 交叉编译QT5.9.9源码 AArch64架构

环境准备 centos7 镜像 下载地址&#xff1a;http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/ aarch64交叉编译链 下载地址&#xff1a;https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/ QT5.9.9源代码 下载地址&#xff1…...

爬虫逆向实战(二十)--某99网站登录

一、数据接口分析 主页地址&#xff1a;某99网站 1、抓包 通过抓包可以发现登录接口是AC_userlogin 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”可以发现txtPassword和aws是加密参数 请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 无…...

【C# 基础精讲】LINQ to Objects查询

LINQ to Objects是LINQ技术在C#中的一种应用&#xff0c;它专门用于对内存中的对象集合进行查询和操作。通过使用LINQ to Objects&#xff0c;您可以使用统一的语法来查询、过滤、排序、分组等操作各种.NET对象。本文将详细介绍LINQ to Objects的基本概念、常见的操作和示例&am…...

【力扣】209. 长度最小的子数组 <滑动窗口>

【力扣】209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的连续子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&a…...

帮助中心应该用什么工具做?

在线帮助中心是指一个位于互联网上的资源平台&#xff0c;提供给用户获取产品或服务相关信息、解决问题以及获取技术支持的渠道。它通常包含了组织化的知识库、常见问题解答&#xff08;FAQ&#xff09;、操作指南、教程视频、用户手册等内容。在线帮助中心的主要目标是为用户提…...

前端面试:【跨域与安全】跨域问题及解决方案

嗨&#xff0c;亲爱的Web开发者&#xff01;在构建现代Web应用时&#xff0c;跨域问题和安全性一直是不可忽视的挑战之一。本文将深入探讨跨域问题的背景以及解决方案&#xff0c;以确保你的应用既安全又能与其他域名的资源进行互操作。 1. 什么是跨域问题&#xff1f; 跨域问…...

【SQL中DDL DML DQL DCL所包含的命令】

SQL中DDL DML DQL DCL所包含的命令 关于DDL、DML、DQL、DCL的定义和适用范围如下&#xff1a; 数据定义语言&#xff08;Data Definition Language&#xff0c;DDL&#xff09;&#xff1a; DDL用于创建、修改和删除数据库中的表、视图、索引等对象。它的主要命令包括CREATE、A…...

LeetCode150道面试经典题-- 二叉树的最大深度(简单)

1.题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 2.示例 3.思路 深度优先遍历 一个二叉树要查询到最大深度&#xff0c;可以将问题转为从根节点出发&#xff0c;查看左右子树的最大深度&am…...

【C++11】future和async等

C11的future和async等关键字 1.async和future的概念 std::async 和 std::future 是 C11 引入的标准库功能&#xff0c;用于实现异步编程&#xff0c;使得在多线程环境中更容易处理并行任务。它们可以帮助你在不同线程中执行函数&#xff0c;并且能够方便地获取函数的结果。 在…...

Linux 系统下 GDB 调试器的使用

文章目录 简介GDB 的介绍GDB 的使用 GDB 常用命令及示例查看相关操作断点相关操作运行相关操作变量相关操作分隔窗口操作 简介 GDB 的介绍 GDB 是 GNU 调试程序&#xff0c;是用来调试 C 和 C 程序的调试器。它可以让程序开发者在程序运行时观察程序的内部结构和内存的使用情况…...

个人首次使用UniAPP使用注意事项以及踩坑

个人首次使用UniAPP 使用注意事项以及踩坑 自我记录 持续更新 1.vscode 插件 uni-create-view 快速nui-app页面的 uni-helper uni-app代码提示的 uniapp小程序扩展 鼠标悬停查文档 Error Lens 行内提示报错 "types": ["dcloudio/types", "mini…...

VSCode 如何解决 scanf 的输入问题——Code is already running!

文章如何使用 VSCode 软件运行C代码中已经介绍了如何在 VSCode 软件中运行C代码&#xff0c;但最近在使用 scanf 想从键盘输入时&#xff0c;运行代码后显示“Code is already running!”&#xff0c;如下图所示&#xff0c;在输出窗口是无法通过键盘输入的。 解决办法如下&am…...

短视频seo源码矩阵系统开源---代码php分享

前言&#xff1a;短视频seo源码 短视频seo矩阵系统源码私有化部署 短视频seo源码 短视频seo矩阵系统源码私有化怎么部署&#xff1f; 首先我们来给大家普及一下什么是短视频seo矩阵系统&#xff1f;视频矩阵分为多平台矩阵与一个平台多账号矩阵&#xff0c;加上seo排名优化&…...

【docker】中文无法显示输入等问题解决方法

every blog every motto: You can do more than you think. csdn: https://blog.csdn.net/weixin_39190382?typeblog ID: 胡侃有料 0. 前言 docker 路径中文不显示&#xff0c;无法输入中文问题解决方法 1. 解决方法 1.1 临时解决 打开etc/profile文件&#xff0c;末尾添…...

leetcode 1035. 不相交的线

2023.8.25 本题可以转化为&#xff1a;求两数组的最长公共子序列。 进而可以用dp算法解决。 方法类似于这题最长公共子序列 。 代码如下&#xff1a; class Solution { public:int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {vector<…...

Hystrix: 服务降级

cloud是基础&#xff0c;eureka是服务注册和发现&#xff0c;consumer是消费者去消费provider里的东西&#xff0c;消费方式就是Feign和Ribbon&#xff0c;feign 接口消费&#xff0c;ribbon Rest消费 服务降级发生在客户端&#xff0c;客户端因为请求关闭的服务器&#xff0…...

高精度运算(加减乘除乘法)

所谓高精度&#xff0c;就是大数的运算&#xff0c;这个大数可能是要远远超过现有数据类型的最大范围。如果我们想进行这样的运算&#xff0c;就要掌握计算的原理——竖式运算。 加法 我们这里先简单考虑非负数的加法&#xff0c;竖式这么列对吧&#xff1a; ①存储 我们如何…...

Mysql数据库技术知识整理

Mysql的知识点目录 重点&#xff1a;架构,引擎,索引&#xff0c;锁机制,事务机制,日志机制&#xff0c;集群,调优 3、Mysql索引 索引概念 覆盖索引&#xff1a; 条件列和结果列都在索引中索引下推&#xff1a; 查询会先过滤条件列&#xff0c;然后回表查数据最左前缀匹配&am…...

SpringBoot整合Mybatis 简单试用

1. 导入依赖 我使用MySQL&#xff0c;需要导入MySQL的驱动依赖此外要在SpringBoot中使用Mybatis&#xff0c;则需要导入Mybatis启动器 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifact…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...