android DocumentFile.isDirectory() 返回意外结果

问题描述 投票:0回答:1

我正在使用

DocumentFile
在我的应用程序中嵌入文件资源管理器,但我遇到了这个奇怪的问题,其中
IsDirectory
方法返回意外结果。

我在 RecyclerView 适配器类中使用它。

    @Override
    public void onBindViewHolder(@NonNull AddFilesAdapter.ViewHolder holder, int position) {
        DocumentFile file = files[position];
        holder.filename.setText(file.getName());
        String type = file.getType();
        holder.setFileIndex(position);

        if (file.isDirectory()) {
            holder.icon.setImageResource(R.drawable.folder);
        } else {
            // set icon to something else
        }

        // some unrelated code
    }

这是我的实现

ViewHolder

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            icon = itemView.findViewById(R.id.IV_FileIcon);
            filename = itemView.findViewById(R.id.TV_FileName);
        }

        public void setFileIndex(int fileIndex) {
            this.fileIndex = fileIndex;
        }

        private int fileIndex;
        public ImageView icon;
        public TextView filename;
    }

这是结果。

注意

payload.bin
.tmp

enter image description here

这是它们在真实文件浏览器上的样子。

enter image description here
View xml 文件在这里很好,我正在使用

tools:src
所以它只显示在 android studio 中

    <ImageView
        android:id="@+id/IV_FileIcon"
        android:layout_width="50dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginStart="12dp"
        tools:src="@drawable/folder" />

抱歉,如果图像太大,我不知道如何在堆栈溢出时调整它们的大小

java android mobile documentfile
1个回答
0
投票

出于效率原因,Android 似乎不会在每次调用

AddFilesAdapter.ViewHolder
时生成新的
onBindViewHolder
实例。

很可能

isDirectory()
返回正确的值,但目前您没有在 else 路径(非目录情况)中设置图标,并且 Android 重用
holder
(
AddFilesAdapter.ViewHolder
) 您看到的图标已设置最后一个目录条目。

如果您不确定函数返回什么,我建议添加

Log
语句,例如

Log.d("fn-dir", file.getName() + " " + file.isDirectory()); 

这将允许您在 logcat 输出上查看实际的文件夹条目及其

isDirectory()
属性。

或者使用(条件)断点并在调试模式下启动应用程序。一旦断点命中,您就可以检查您想要的所有值。

© www.soinside.com 2019 - 2024. All rights reserved.