You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Jsoup检测空字段?解决RecyclerView索引越界问题

解决爬虫数据字段缺失导致的RecyclerView IndexOutOfBounds错误

这个问题我之前碰到过类似的,核心问题就是你现在是把每个字段单独提取成独立列表,而不是按每个movie-box容器来逐个收集数据,导致不同字段的列表长度不一致(比如有的20条,有的19条),绑定RecyclerView的时候用同一个position去取不同列表的元素,自然会出现索引越界。

给你一套直接可用的解决方案:

第一步:封装电影数据为实体类

先创建一个Movie类,把你需要的字段(比如story、year等)都定义进去,这样每个电影的信息都能被统一管理:

public class Movie {
    private String story;
    // 可以根据需求添加其他字段,比如year、title、rating等

    // 构造方法
    public Movie(String story) {
        this.story = story;
    }

    // Getter方法
    public String getStory() {
        return story;
    }

    // 如果有其他字段,记得添加对应的Getter和Setter
}

第二步:按movie-box容器逐个提取数据

这是最关键的一步——先获取所有的movie-box条目,然后遍历每个容器,单独提取里面的字段,缺失的字段用默认值(比如空字符串、"未知")填充:

// 先获取页面上所有的movie-box容器,确保数量是20个
Elements movieBoxes = document.select("div[class=movie-box]"); // 替换成你实际获取movie-box的选择器
List<Movie> movieList = new ArrayList<>();

for (Element movieBox : movieBoxes) {
    // 针对当前movie-box,单独提取story字段
    // 使用selectFirst(),找不到就返回null,避免返回空列表
    Element storyElement = movieBox.selectFirst("div[class=movie-details existing-details] div[class=specials] div[class=movie-excerpt] p[class=story]");
    // 字段缺失时用空字符串或自定义默认值填充
    String story = storyElement != null ? storyElement.text() : "";

    // 如果还有其他字段(比如year),用同样的方式提取
    // Element yearElement = movieBox.selectFirst("div[class=year]");
    // String year = yearElement != null ? yearElement.text() : "未知年份";

    // 将当前电影的信息加入列表
    movieList.add(new Movie(story));
}

// 现在movieList的长度和movieBoxes一致(20条),直接传给Adapter
RecyclerAdapter recyclerAdapter = new RecyclerAdapter(getContext(), movieList);

第三步:修改RecyclerView Adapter的绑定逻辑

现在Adapter接收的是List<Movie>,绑定的时候直接从对应位置的Movie对象里取字段,再也不会出现索引越界:

// 假设你的Adapter里持有List<Movie> movieList
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    Movie currentMovie = movieList.get(position);
    holder.textView_subject.setText(currentMovie.getStory());
    // 如果有其他字段,比如year,直接用currentMovie.getYear()即可
}

为什么这个方法能解决问题?

之前的写法是把所有存在的story字段拉成一个列表,缺失的条目会被直接跳过,导致列表长度小于movie-box的数量。而现在的写法是每个movie-box对应一个Movie对象,不管字段是否存在,都会生成一个对象加入列表,所以movieList的长度永远和movie-box的数量一致,绑定的时候用position取元素就不会有索引越界的问题了。

内容的提问来源于stack exchange,提问作者Sercan Dorman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:32:32