2013-07-17 38 views
1

我正在處理文件管理器。fileManager中的java.lang.IndexOutOfBoundsException

我該如何解決這個問題?

我無法理解異常的原因。錯誤日誌如下所示

ERROR/AndroidRuntime(6155): FATAL EXCEPTION: main 
    java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
    at java.util.ArrayList.get(ArrayList.java:304) 
    at com.FileExplorer.FileSystemAdapter.getView(FileSystemAdapter.java:46) 

這裏是MainActivity

public class MainActivity extends Activity 
{ 
    FileSystemAdapter adapter; 
    ListView lv; 
    File currentDirectory ; 
    TextView textTitle ; 
    ArrayList<String> directoryEntries; 
    ArrayList<Integer> isFolders ; 
    public final static int yesFolder = 20; 
    public final static int noFolder = 30; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     textTitle = (TextView)findViewById(R.id.textTitle); 
     lv = (ListView)findViewById(R.id.listView); 
     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() 
     { 
      @Override 
      public void onItemClick(AdapterView <?> parent, View view, int position, long id) 
      { 
       String selectedFileString = directoryEntries.get(position); 
       if(selectedFileString.equals("..")) 
        upOneLevel(); 
       else 
       { 
        File clickedFile = new File(selectedFileString); 
        browseTo(clickedFile); 
       } 
      } 
     }); 
     browseTo(Environment.getExternalStorageDirectory()); 
    } 
    private void browseTo(File directory) 
    { 
     if(directory.isDirectory()) 
     { 
      currentDirectory = directory; 
      fill(directory.listFiles()); 
      textTitle.setText(directory.getAbsolutePath()); 
     } 
     else 
     { 
      Intent intent = new Intent(Intent.ACTION_VIEW , Uri.parse("file://" + directory.getAbsolutePath())); 
      startActivity(intent); 
     } 
    } 
    private void fill(File[] files) 
    { 
     if(files == null) 
     { 
      Toast.makeText(this,"fill empty argument ",Toast.LENGTH_LONG).show(); 
      return ; 
     } 
     directoryEntries = new ArrayList<String>(); 
     isFolders = new ArrayList<Integer>(); 

     if(currentDirectory.getParent() != null) 
     directoryEntries.add(".."); 
     for(File file : files) 
     { 
      directoryEntries.add(file.getAbsolutePath()); 
      if(file.isDirectory()) 
       isFolders.add(yesFolder); 
      else 
       isFolders.add(noFolder); 
     } 
     adapter = new FileSystemAdapter(this,directoryEntries,isFolders); 
     lv.setAdapter(adapter); 
     adapter.notifyDataSetChanged(); 
    } 
    private void upOneLevel() 
    { 
     if(currentDirectory.getParent() != null) 
     { 
      browseTo(currentDirectory.getParentFile()); 
     } 
    } 
} 

這裏是BaseAdapter類

public class FileSystemAdapter extends BaseAdapter 
{ 
    LayoutInflater inflater; 
    ArrayList<String> files; 
    ArrayList<Integer> isFolder; 
    Context ctx; 
    public FileSystemAdapter(Context ctx ,ArrayList<String> files,ArrayList<Integer> isFolder) 
    { 
     this.files = files; 
     this.ctx = ctx; 
     this.isFolder = isFolder; 
     inflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 
    @Override 
    public int getCount() 
    { 
     return files.size(); 
    } 
    @Override 
    public Object getItem(int position) 
    { 
     return files.get(position); 
    } 
    @Override 
    public long getItemId(int position) 
    { 
     return position; 
    } 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     View v = inflater.inflate(R.layout.item,parent,false); 
     ImageView imageFolder = (ImageView)v.findViewById(R.id.imageFolder); 
     if(isFolder.get(position) == MainActivity.yesFolder) 
     { 
      imageFolder.setImageResource(R.drawable.folder); 
     } 
     TextView textItem = (TextView)v.findViewById(R.id.textItem); 
     textItem.setText(files.get(position)); 
     return v; 
    } 
} 
+0

哪一個是第46行? – njzk2

回答

0

directoryEntries包含1項比isFolders更多,因爲

directoryEntries.add(".."); 
+0

我整天在看代碼,看不到這個小麻煩,非常感謝。 和我有另一個問題,我怎麼排序directoryEntries不會失去directoryEntries和isFolders之間的界限; (對於我的英語不好,請選擇sory) – doomed

+0

你可以有一個'File'列表並且在getView中測試isDirectory。 – njzk2

相關問題