RecyclerView的第一个项目消失了

3

我有一个Activity。当创建Activity时,我正在创建一个包含一些数据的文件。所有文件都已经正确创建并且数据也正确地写入了。 以下是我的代码:

public class MyRecordingsActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private RecordingsAdapter recordingsAdapter;
    private ArrayList<Recording>  recordingArrayList;
    private File userRecordingFile;
    private static final String USER_MIX_DIR = "UserMix";
    private String lines[]=new String[]{};

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


        for(int i=0;i<5;i++){
            try{
                userRecordingFile = new File(createRecordingFiles(), "Recording"+i+".txt");
                FileWriter writer = new FileWriter(userRecordingFile);
                writer.append("DEF"+i+"\nHIJ "+i);
                writer.flush();
                writer.close();
            }
            catch (Exception e){
                e.printStackTrace();
            }

        }

        getSupportActionBar().hide();

        recordingArrayList=new ArrayList<>();
        recyclerView=findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        recyclerView.setHasFixedSize(true);

        readFiles();


        Toast.makeText(getApplicationContext(),lines[0],Toast.LENGTH_SHORT).show();
        Toast.makeText(getApplicationContext(),lines[1],Toast.LENGTH_SHORT).show();
        recordingArrayList.add(new Recording(R.drawable.ic_launcher,lines[0],lines[1]));
        recordingArrayList.add(new Recording(R.drawable.ic_launcher,lines[2],lines[3]));
        recordingArrayList.add(new Recording(R.drawable.ic_launcher,lines[4],lines[5]));
        recordingArrayList.add(new Recording(R.drawable.ic_launcher,lines[6],lines[7]));
        recordingArrayList.add(new Recording(R.drawable.ic_launcher,lines[8],lines[9]));

        recordingsAdapter=new RecordingsAdapter(recordingArrayList);
        recyclerView.setAdapter(recordingsAdapter);
    }


    public  File createRecordingFiles() {

        File dirRoot = getExternalCacheDir();

        File workDir = new File(dirRoot, USER_MIX_DIR);
        //Toast.makeText(getApplicationContext(), "HI", Toast.LENGTH_SHORT).show();
        if (!workDir.exists()) {
            workDir.mkdirs();

            File recordingFile = new File(workDir, "Recording File ");
            try {
                recordingFile.createNewFile();
            } catch (IOException e) {

            }
        }
        return workDir;
    }


    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.close() ;
        }catch (IOException e) {
            e.printStackTrace();
        }


    }

}

我已经正确编写了Toast,它显示了DEF0和HIJ0,但它们没有在RecyclerView中显示。以下是屏幕截图:

enter image description here

以下是我的适配器类:
public class RecordingsAdapter extends RecyclerView.Adapter<RecordingsAdapter.RecyclerViewHolder> {
    public static final int TYPE_HEAD=0;
    public static final int TYPE_LIST=1;
    private ArrayList<Recording> recordingArrayList;

    public RecordingsAdapter(ArrayList<Recording> recordingArrayList) {
        this.recordingArrayList = recordingArrayList;
    }

    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view;
        RecyclerViewHolder recyclerViewHolder;

        if(viewType == TYPE_LIST){
            view= LayoutInflater.from(parent.getContext()).inflate(R.layout.cell_my_recordings,parent,
                    false);
            recyclerViewHolder=new RecyclerViewHolder(view,viewType);
            return recyclerViewHolder;

        }else if(viewType == TYPE_HEAD){
            view= LayoutInflater.from(parent.getContext()).inflate(R.layout.head_layout,parent,
                    false);
            recyclerViewHolder=new RecyclerViewHolder(view,viewType);
            return recyclerViewHolder;
        }
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolder holder, int position) {
        Recording recording;
        if(holder.view_type==TYPE_LIST){
            recording=recordingArrayList.get(position);
            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");
        }
    }

    @Override
    public int getItemCount() {
        return recordingArrayList.size();
    }

    @Override
    public int getItemViewType(int position) {
        if(position==0){
            return TYPE_HEAD;
        }
        return TYPE_LIST;
    }

    public static class RecyclerViewHolder extends RecyclerView.ViewHolder{
        int view_type;
        ImageView imageView;
        TextView typeTextView,dateTimeTextView;
        TextView typeHeaderTextView,titleHeaderTextView,dateTimeHeaderTextView;

        public RecyclerViewHolder(View itemView, int viewType) {
            super(itemView);
            if(viewType==TYPE_LIST){
                typeTextView=itemView.findViewById(R.id.tv_cell_recording_recording_name);
                imageView=itemView.findViewById(R.id.iv_cell_recordings);
                dateTimeTextView=itemView.findViewById(R.id.tv_cell_recording_date_time);
                view_type=1;
            }else if(viewType==TYPE_HEAD){
                typeHeaderTextView=itemView.findViewById(R.id.tv_type_head_layout);
                titleHeaderTextView=itemView.findViewById(R.id.tv_title_head_layout);
                dateTimeHeaderTextView=itemView.findViewById(R.id.tv_date_time_head_layout);
                view_type=0;
            }

        }
    }
} 

DEf0和HIJ 0在recyclerview中没有显示。我无法理解它们为什么没有在我的recyclerview中显示。我的日志中没有错误。希望能得到任何帮助。


你能贴出你的RecordingsAdapter类吗? - Danail Alexiev
请发布您的activity_my_recordings.xml文件的内容。 - Rosário Pereira Fernandes
@DanailAlexiev 我已经添加了适配器部分,请看一下 - user8412632
@RosárioPereiraFernandes <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"></RelativeLayout> - user8412632
你可能没有正确使用R.layout.head_layout,或者它的所有视图都被隐藏了。 - Lalit Jadav
你返回的是位置0的TYPE_HEAD而不是TYPE_LIST。这就是为什么在位置0上没有显示TYPE_LIST的原因。 - Aditya
6个回答

6

你的方法是错误的...

你添加了五个项到recyclerview中,但要注意第一个是头部。

所以这会把你的第一项作为头部,剩下的四项会显示在列表中。

你需要做的是,将虚拟项作为第一项传递进去,然后再添加你的五个项目。

这样就可以解决你的问题了。

你可以尝试这种方法:

recordingArrayList.add(new Recording(R.drawable.ic_launcher,"", ""));
recordingArrayList.add(new Recording(R.drawable.ic_launcher,lines[0],lines[1]));
        recordingArrayList.add(new Recording(R.drawable.ic_launcher,lines[2],lines[3]));
        recordingArrayList.add(new Recording(R.drawable.ic_launcher,lines[4],lines[5]));
        recordingArrayList.add(new Recording(R.drawable.ic_launcher,lines[6],lines[7]));
        recordingArrayList.add(new Recording(R.drawable.ic_launcher,lines[8],lines[9]));

你也可以按照以下方式进行:

更改适配器代码

@Override
    public int getItemCount() {
        return recordingArrayList.size() + 1;
    }

@Override
    public void onBindViewHolder(RecyclerViewHolder holder, int position) {
        Recording recording;
        if(holder.view_type==TYPE_LIST){
            recording=recordingArrayList.get(position - 1);
            ...

        }else if (holder.view_type == TYPE_HEAD){
            holder.typeHeaderTextView.setText("TYPE");
            holder.titleHeaderTextView.setText("TITLE");
            holder.dateTimeHeaderTextView.setText("DATE/TIME");
        }
    }

但是您需要通过以下方式验证空列表

我明白你的意思。但是如果我不能将第一个项目作为虚拟项目传递呢? - user8412632
你正在将第一个项目作为虚拟项目传递,但我不想这样做。 - user8412632
@LalitJadhav 谢谢。我没有将第一个项目添加为虚拟项目,但是我按照你的建议修改了我的适配器代码,现在它可以正常工作了。非常感谢你的帮助,我很感激。 - user8412632
@abu 欢迎你.. 但是请记住,我的名字是LalitJadav,不是LalitJadhav。 - Lalit Jadav

3

你的回收站可能会被工具栏隐藏。给一个56dp的顶部边距。

android:layout_marginTop="56dp"

2

请尝试设置您的标题,这是您的第一个位置。

使用以下内容:

@Override
public int getItemViewType(int position) {
    return TYPE_LIST;
}

不要这样做

@Override
public int getItemViewType(int position) {
    if(position==0){
        return TYPE_HEAD;
    }
    return TYPE_LIST;
}

我的应用程序崩溃了。 - user8412632
请发布日志。 - iamgopal
3
这不是一个好的解决方案。如果再次使用该位置,覆盖getItemViewType是无效的。 - vanlooverenkoen
@iamgopal java.lang.NullPointerException: 尝试在空对象引用上写入字段'int android.support.v7.widget.RecyclerView$ViewHolder.mItemViewType' - user8412632
@abu 你可以使用 return as TYPE_LIST 来检查我的编辑答案。 - Ratilal Chopda
@abu 请查看此参考链接:https://www.journaldev.com/12372/android-recyclerview-example - Gowthaman M

1

对我有用的方法是首先从数组中删除任何空值(因为第一个元素可能为空),然后再添加空值。这样,我避免了重复空值。我没有使用“if”或任何适配器实现的方法,因此使我的应用程序更加高效。

我的代码如下:

myArray.remove(null); // here I remove any preview added null value as first (0 position) element
myArray.add(0, null); //now I add null as first element
//this way I am avoiding showing content with a null values

我希望这能帮助到某人


0

弹出提示是因为你的卡片在那里,但被工具栏遮挡了。你可以给RecyclerView添加一些边距:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="schemas.android.com/apk/res/android"
    xmlns:app="schemas.android.com/apk/res-auto"
    xmlns:tools="schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"> 
    <android.support.v7.widget.RecyclerView
        android:layout_marginTop:"?android:attr/actionBarSize" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:id="@+id/recyclerView" />
</RelativeLayout>

0

如果你想在不传递活动中的第一个空数据的情况下添加标题,那么你需要在适配器的第一个位置添加一个空条目,就像这样。

将以下代码替换到你的适配器中:

          public RecordingsAdapter(ArrayList<Recording>  recordingArrayList) {

           this.recordingArrayList = recordingArrayList;
           this.recordingArrayList.add(0,null);

          }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接