如何用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
相关产品推荐
相关产品推荐

