Android Studio实现解析HTML获取图片URL,将URL存到list,进行列表展示

效果

在这里插入图片描述

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
参考这篇博客尝试解决

代码

activity_main.xml

设置recyclerview

<?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

设置在recycleView显示的数据格式

<?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="horizontal"
    android:padding="2dp">
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:layout_gravity="center">

        <TextView
            android:id="@+id/labelID"
            android:layout_width="150dp"
            android:layout_height="match_parent"
            android:text="编号"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/pokemonName"
            android:layout_width="150dp"
            android:layout_height="match_parent"
            android:text="名字"
            android:textSize="16sp" />
    </LinearLayout>

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:scaleType="centerCrop"
        android:adjustViewBounds="true" />

</LinearLayout>

MainActivity
import static android.content.ContentValues.TAG;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;


import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private ImageAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recyclerView);
        //通过设置RecyclerView的布局管理器为StaggeredGridLayoutManager,并指定每行或每列的单元格数量和布局方向,就可以实现错乱瀑布流的效果
        //spanCount:指定每行或每列的单元格数量。在这个例子中,设置为2,表示每行有两个单元格。
        //orientation:指定布局的方向,VERTICAL表示垂直
        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false));

        List<ImageModel> imageList = new ArrayList<>();
        //自定义的适配器类 将数据绑定到RecyclerView中的每个列表项上
        adapter = new ImageAdapter(imageList, this);

        //调用RecyclerView的setAdapter()方法,将适配器与RecyclerView关联
        recyclerView.setAdapter(adapter);

        // 发起HTTP请求并解析数据
        //执行 ParseDataTask 的异步任务
        new ParseDataTask().execute();
    }

    //异步任务(AsyncTask)
    //在后台线程中解析网页内容并返回一个包含图像URL的列表
    private class ParseDataTask extends AsyncTask<Void, Void, List<ImageModel>> {

        //使用Jsoup库解析指定URL的网页内容
        @Override
        protected List<ImageModel> doInBackground(Void... voids) {
            List<ImageModel> mImageUrlsList = new ArrayList<>();
            try {
                String url = "http://home.meishichina.com/show-top-type-recipe.html";

                //通过Jsoup的connect()方法获取指定URL的Document对象
                Document doc = Jsoup.connect(url).get();
                //使用CSS选择器选择所有包含图像的div元素,并遍历每个元素。
                // 通过选择器获取图像的URL,并将其添加到mImageUrlsList列表中
                Elements images = doc.select("div.pic");
                for (Element image : images) {
                    String imageUrl = image.select("a").select("img").attr("data-src");
                    mImageUrlsList.add(new ImageModel(imageUrl));
                }
            } catch (Exception e) {

            }

            return mImageUrlsList;
        }

        //异步任务完成后,onPostExecute() 方法会被调用,从而更新UI
        //接收doInBackground()方法返回的结果作为参数

        @Override
        protected void onPostExecute(List<ImageModel> imageList) {
            //通过适配器(adapter)设置图像列表
            adapter.setImageList(imageList);

            //调用notifyDataSetChanged()方法通知适配器数据集发生变化
            adapter.notifyDataSetChanged();
        }
    }
}
Image适配器
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

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) {
        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();

        holder.labelID.setText(String.valueOf(position + 1));
        holder.pokemonName.setText("未知名称");

        //使用Picasso库加载图像URL并显示在ViewHolder的ImageView
        Picasso.get()
                .load(imageUrl)
                .fit()
                .centerCrop()
                .into(holder.imageView);

    // 获取随机高度
    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;
        TextView labelID;
        TextView pokemonName;

        //持有每个列表项的视图组件,这里是一个ImageView
        public ImageViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.imageView);
            labelID = (TextView) itemView.findViewById(R.id.labelID);
            pokemonName = (TextView) itemView.findViewById(R.id.pokemonName);
        }
    }
}

ImageModel 接收图片URL
//接收图片url
public class ImageModel {
    private String imageUrl;

    public ImageModel(String imageUrl) {
        this.imageUrl = imageUrl;
    }

    public String getImageUrl() {
        return imageUrl;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio获取网络数据、解析JSON并展示歌曲列表,并且点击条目播放的步骤如下: 1. 首先,确保在AndroidManifest.xml文件中添加网络权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` 2. 在你的Activity中添加一个RecyclerView来展示歌曲列表,以及一个MediaPlayer来播放音乐。 3. 创建一个URL对象,以获取你想要的数据。例如: ```java URL url = new URL("http://example.com/songs.json"); ``` 4. 使用HttpURLConnection或者OkHttp来建立网络连接,并获取数据。我们必须在子线程中进行网络请求,以防止阻塞主线程。例如: ```java // 创建连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 设置请求方法 connection.setRequestMethod("GET"); // 打开连接 connection.connect(); // 读取数据 InputStream stream = connection.getInputStream(); ``` 5. 将获取到的数据流解析为JSON数据,并提取出需要的信息。例如: ```java BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); StringBuilder builder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { builder.append(line); } String json = builder.toString(); // 解析JSON JSONArray jsonArray = new JSONArray(json); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); String songTitle = jsonObject.getString("title"); // 提取其他字段 } ``` 6. 使用RecyclerView来展示歌曲列表。创建一个适配器,将数据传递给适配器并设置给RecyclerView。例如: ```java RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); MyAdapter adapter = new MyAdapter(songList); recyclerView.setAdapter(adapter); ``` 7. 在适配器的ViewHolder中为条目设置点击事件监听器。在点击事件中启动MediaPlayer来播放音乐。例如: ```java itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 启动MediaPlayer播放音乐 mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(songUrl); mediaPlayer.prepare(); mediaPlayer.start(); } }); ``` 这样就完成了使用Android Studio获取网络数据、解析JSON并展示歌曲列表,并且点击条目播放的步骤。可以根据实际情况进行进一步的定制和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值