RecyclerView首个数据项不显示问题求助
问题排查与修复方案
看起来你的RecyclerView不显示数据的核心原因是Adapter的Item数量计算和数据索引错位,我帮你拆解一下问题并给出修复步骤:
1. 核心问题:Header项导致的Item数量与索引不匹配
你的Adapter将position=0设为Header,但getItemCount()只返回了数据列表的长度,这就造成了两个问题:
- 总Item数少了1个(Header的位置没算进去),导致最后一条数据无法显示
- 列表项的数据索引错位:当
position>=1时,直接用position去取recordingArrayList的元素,会跳过第一条数据,并且数据量变大后会触发索引越界异常
修复代码:
修改RecordingsAdapter的getItemCount()方法:
@Override public int getItemCount() { // 加上Header的1个位置 return recordingArrayList.size() + 1; }
修改RecordingsAdapter的onBindViewHolder()里的TYPE_LIST分支:
@Override public void onBindViewHolder(RecyclerViewHolder holder, int position) { Recording recording; if(holder.view_type==TYPE_LIST){ // 因为position=0是Header,所以列表数据要从position-1开始取 recording=recordingArrayList.get(position - 1); holder.imageView.setImageResource(recording.getImage_id()); holder.typeTextView.setText(recording.getTitle()); holder.dateTimeTextView.setText(recording.getDatetime()); }else if (holder.view_type == TYPE_HEAD){ holder.typeHeaderTextView.setText("TYPE"); holder.titleHeaderTextView.setText("TITLE"); holder.dateTimeHeaderTextView.setText("DATE/TIME"); } }
2. 潜在的资源泄漏问题(非当前故障原因,但建议修复)
你的readFiles()方法里,BufferedReader br没有在finally块中关闭,可能会导致资源泄漏,建议修改:
public void readFiles(){ StringBuilder text = new StringBuilder(); BufferedReader br=null; try { File dirRoot = getExternalCacheDir(); File workDir = new File(dirRoot, USER_MIX_DIR); for(int i=0;i<5;i++){ File file = new File(workDir,"Recording"+i+".txt"); br = new BufferedReader(new FileReader(file)); String line; while ((line = br.readLine()) != null) { text.append(line); text.append('\n'); lines=text.toString().split("\n"); } // 每个文件读完后关闭当前的br if(br != null) br.close(); } }catch (IOException e) { e.printStackTrace(); } finally { // 确保最后关闭资源 try { if(br != null) br.close(); } catch (IOException e) { e.printStackTrace(); } } }
3. 多余的文件创建(可选优化)
createRecordingFiles()方法里创建的recordingFile是多余的,因为你后续会创建Recording0.txt等文件,这个可以删掉:
public File createRecordingFiles() { File dirRoot = getExternalCacheDir(); File workDir = new File(dirRoot, USER_MIX_DIR); if (!workDir.exists()) { workDir.mkdirs(); // 删掉下面这几行无用的代码 // File recordingFile = new File(workDir, "Recording File "); // try { // recordingFile.createNewFile(); // } catch (IOException e) { // } } return workDir; }
为什么之前Toast能显示数据但RecyclerView不行?
因为你的lines数组确实正确读取了数据,并且recordingArrayList也正确添加了5条数据,但Adapter的索引错位导致这些数据没有被正确绑定到RecyclerView的Item上:
- 原本应该显示第一条数据的位置被Header占用了
- 后续的列表项都取了下一条数据,最后一条数据没有对应的Item位置
修复完上面的问题后,你的RecyclerView应该就能正常显示所有数据了。
内容的提问来源于stack exchange,提问作者user8412632
相关产品推荐
相关产品推荐

