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

这篇具有很好参考价值的文章主要介绍了Android Studio实现解析HTML获取json,解析json图片URL,将URL存到list,进行瀑布流展示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

效果

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

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" />
 <application
  android:usesCleartextTraffic="true">
错误

如果出现错误:app:checkDebugDuplicateClasses
参考这篇博客尝试解决文章来源地址https://www.toymoban.com/news/detail-656802.html

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.RecyclerView
        android: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">

    <ImageView
        android: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<>();

    @Override
    protected 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>>() {
        @Override
        public 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();

            //转换成object
            JSONObject 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
    @Override
    public 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中的视图
    @Override
    public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {
        ImageModel imageModel = imageList.get(position);//获取特定位置的图像模型(ImageModel)对象,并从中获取图像URL
        String imageUrl = imageModel.getImageUrl();

        //使用Picasso库加载图像URL并显示在ViewHolder的ImageView
        Picasso.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之间的随机值
    }

    //返回图像列表的大小,即列表中包含的图像数量
    @Override
    public int getItemCount() {
        return imageList.size();
    }

    //设置适配器的图像列表
    public void setImageList(List<ImageModel> imageList) {
        this.imageList = imageList;
    }

    public class ImageViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;

        //持有每个列表项的视图组件,这里是一个ImageView
        public 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,进行瀑布流展示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Android Studio实现图片滤镜应用

    简介: 本文将介绍如何使用Android Studio开发一个图片滤镜应用。通过应用中提供的滤镜效果,用户可以对图片进行美化和编辑。我们将使用Android Studio提供的图像处理库和一些常见的滤镜算法来实现这个应用。 步骤一:创建新项目 打开Android Studio并创建一个新的项目。在项目

    2024年02月12日
    浏览(33)
  • 递归解析Json,实现生成可视化Tree+快速获取JsonPath

    内部平台的一个小功能点的实现过程,分享给大家: 递归解析Json,可以实现生成可视化Tree+快速获取JsonPath 。 步骤: 1.利用JsonPath读取根,获取JsonObject 2.递归层次遍历JsonObjec,保存结点信息 3.利用zTree展示结点为可视化树,点击对应树的结点即可获取对应结点的JsonPath 示例

    2024年02月08日
    浏览(31)
  • Grafana获取URL地址中的json数据

    官方教程:https://grafana.github.io/grafana-json-datasource/query-editor 直接在界面中下载这个插件即可: 也可以使用命令安装: 这里我们使用 fastapi 发送URL,模拟路由 可以访问本地: http://127.0.0.1:15555/test_data 得到dataframe转为字典的数据 点击Grafana左下角的小齿轮,点击 Add new data sour

    2023年04月12日
    浏览(36)
  • 【Vue】url拼接参数获取解析

    前言: 前端在开发的时候有很多情况下需要提供不带参数的链接或者带参数的链接给自己使用或者给第三方系统,如果提供给第三方系统使用的话一般是第三方需要通过iframe/window.open/a标签打开链接进入对应的页面。 情况一:获取当前浏览器地址栏链接 1.location.href:获取当

    2023年04月09日
    浏览(34)
  • Android Studio Electric Eel 2022.1.1 Patch 2 导入opencv 4.5,并实现图片灰度变换和图片叠加

    Android Studio Electric Eel 2022.1.1 Patch 2 https://sourceforge.net/projects/opencvlibrary/files/4.5.0/opencv-4.5.0-android-sdk.zip/download with API23: 导入opencv sdk: File-New-Import Module 添加工程依赖:File-Project Structure, sdk为opencv sdk. plugins { id ‘com.android.application’ version ‘7.4.2’ apply false id ‘com.android.library’

    2024年02月05日
    浏览(51)
  • Spring MVC -- 获取参数(普通对象+JSON对象+URL地址参数+文件+Cookie/Session/Header)

    目录 1.获取参数 1.1获取单个参数 1.2获取多个参数 传参注意事项: 2.获取对象  3.后端参数重命名@RequestParam 4.获取JSON对象@RequestBody 5.从 URL 地址中获取参数 @PathVariable 6.上传文件 @RequestPart 7.获取Cookie/Session/Header 7.1 获取 Request 和 Response 对象 7.2 获取Cookie (1)Servlet 获取 Cooki

    2024年02月16日
    浏览(31)
  • Android Studio Giraffe 添加 maven { url “https://jitpack.io“ }报错

    Android Studio Giraffe 添加 maven { url “https://jitpack.io” }报错 解决方法 新版maven写法发生了改变: 另外ndk的写法也变了

    2024年02月07日
    浏览(40)
  • android studio 添加并读取json配置文件

    第一步:在android  studio中添加json文件;   第二步:读取文件的函数

    2024年02月16日
    浏览(33)
  • 获取url地址后面参数的2种方法(小程序二维码跳转参数解析)

            微信扫描小程序二维码后,在页面的onLoad函数的参数options内可以拿到跳转参数scene值,但是需要对scene进行decodeURIComponent操作,方法如下: 方法一: 方法二:

    2024年02月17日
    浏览(37)
  • Android 解析JSON数据

    第一种使用JSONObject解析JSON数据,这是Android中最基本的数据解析方式 第二种方式通过GSON去解析JSON数据  同样的数据格式 GSON的数据解析看起来代码量相对小一点,但所创建的类也是必须的 第一个支持的类,此类为自定义名字,为了方便随意起的,但在项目中要正规取名,见

    2024年02月11日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包