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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:58:01