我正在使用
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
这是它们在真实文件浏览器上的样子。
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" />
抱歉,如果图像太大,我不知道如何在堆栈溢出时调整它们的大小
出于效率原因,Android 似乎不会在每次调用
AddFilesAdapter.ViewHolder
时生成新的 onBindViewHolder
实例。
很可能
isDirectory()
返回正确的值,但目前您没有在 else 路径(非目录情况)中设置图标,并且 Android 重用 holder
(AddFilesAdapter.ViewHolder
) 您看到的图标已设置最后一个目录条目。
如果您不确定函数返回什么,我建议添加
Log
语句,例如
Log.d("fn-dir", file.getName() + " " + file.isDirectory());
这将允许您在 logcat 输出上查看实际的文件夹条目及其
isDirectory()
属性。
或者使用(条件)断点并在调试模式下启动应用程序。一旦断点命中,您就可以检查您想要的所有值。