只需要在数组中显示文件名而不是整个路径

时间:2014-05-16 16:33:19

标签: android arraylist path

我需要在我的App文件夹中获取文件的文件名,但它提出了整个路径/ storage / emulated / 0 / AppFolder / file1.pdf。如何才能让File.pdf显示而不是整个路径。请指教

 ArrayList<File> files = new ArrayList<File>();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
File file[] =  Environment.getExternalStoragePublicDirectory("/AppFolder").listFiles();
    recursiveFileFind(file);

    setListAdapter(new ArrayAdapter<File>(ViewInspection.this,
            android.R.layout.simple_list_item_1, files));
    Toast.makeText(this, "" + files.size(), Toast.LENGTH_LONG).show();
}

public void recursiveFileFind(File[] file1) {
    int i = 0;
    String filePath = "";
    if (file1 != null) {
        while (i != file1.length) {
            filePath = file1[i].getAbsolutePath();
            files.add(file1[i]);
            if (file1[i].isDirectory()) {
                File file[] = file1[i].listFiles();
                recursiveFileFind(file);
            }else{
                            }

            i++;
            Log.d(i + "", filePath);
        }
    }
}}

3 个答案:

答案 0 :(得分:0)

使用File.getName()而不是File.getAbsolutePath()

    while (i != file1.length) {
        filePath = file1[i].getName();// here
        files.add(file1[i].getName());//Updated here
         if (file1[i].isDirectory()) {
             File file[] = file1[i].listFiles();
             recursiveFileFind(file);
            }

             i++;
             //Log.d(i + "", filePath);
//Update
Toast.makeText(getActivity(), filePath, Toast.LENGTH_LONG).show();
         }

答案 1 :(得分:0)

将File的文件arraylist更改为String的arraylist。更改以下

ArrayList<String> files = new ArrayList<String>();//Updated
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
File file[] =  Environment.getExternalStoragePublicDirectory("/AppFolder").listFiles();
    recursiveFileFind(file);

    setListAdapter(new ArrayAdapter<String>(ViewInspection.this,//Updated
            android.R.layout.simple_list_item_1, files));
    Toast.makeText(this, "" + files.size(), Toast.LENGTH_LONG).show();
}

答案 2 :(得分:0)

这里的问题:

您创建File的适配器,默认情况下ArrayAdapter将使用其包含的对象的.toString()(在本例中为File)。

.toString()的{​​{1}}是

File

public String toString() { return getPath(); } 将返回抽象路径名。

getPath

由于您想获得名称,解决方案可能会有所不同。使用 * Converts this abstract pathname into a pathname string. The resulting * string uses the {@link #separator default name-separator character} to * separate the names in the name sequence. * * @return The string form of this abstract pathname 代替<String>的速度越快,编辑代码为:

<File>

但是,如果您想从filePath = file1[i].getAbsolutePath(); files.add(file1[i].getName()); 获取File实例,此解决方案无法帮助您。

你可以:

  1. 创建类似&#34;包装器&#34; class,它将包含有关文件的信息,并有一个覆盖ArrayAdapter,它将打印文件名。 包装类如:

    .toString()

    然后使用public static class FileWrapper { private final File file; private final String fileName; public FileWrapper(File file) { this.file = file; this.fileName = file.getName(); } public File getFile() { return file; } @Override public String toString() { return fileName; } } ,您将获得正确的名称,并使用<FileWrapper>来获取文件实例。 警告我使用了getItem(position).getFile(),因为如果您将此类声明为内部类,我认为会更好,但如果您不删除static

  2. 创建static(或ArrayAdapter的子类,我更喜欢但是)并覆盖BaseAdapter以满足您的需求。我没有尝试过这个解决方案,但我发现它有点困难,因为你应该保存inflater,使用的资源然后膨胀和编辑文本。

  3. 如果你只关心&#34;显示文件名&#34;,你可以进行第一次编辑,你没事。