public List<Mp3Info> getMp3Files(String path) {
File file = new File(SDCardRoot + File.separator + path);
List<Mp3Info> mp3Infos = new ArrayList<Mp3Info>(); 
Mp3Info mp3Info = new Mp3Info();
File[] f = file.listFiles();
for (int i = 0; i < f.length; i++) {
if (f[i].getName().endsWith("mp3")) {
mp3Info.setMp3Name(f[i].getName());
mp3Info.setMp3Size(f[i].length() + "");
System.out.println(mp3Info);
mp3Infos.add(mp3Info);
}
}
System.out.println(mp3Infos);
return mp3Infos;
}
/**
 * 读取一个文件夹内mp3文件及文件大小 *
 */
public List<Mp3Info> getMp3Files(String path) {
File file = new File(SDCardRoot + File.separator + path);
List<Mp3Info> mp3Infos = new ArrayList<Mp3Info>(); 
File[] f = file.listFiles();
for (int i = 0; i < f.length; i++) {
if (f[i].getName().endsWith("mp3")) {
Mp3Info mp3Info = new Mp3Info();
mp3Info.setMp3Name(f[i].getName());
mp3Info.setMp3Size(f[i].length() + "");
System.out.println(mp3Info);
mp3Infos.add(mp3Info);
}
}
System.out.println(mp3Infos);
return mp3Infos;
}上面两个函数,当Mp3Info mp3Info = new Mp3Info();这条语句放的位置不同时,第一条打印语句相同,第二条打印语句不同。第一个函数的第二条打印语句没有得到预期的结果,也就是记录没有添加进去。为什么?

解决方案 »

  1.   

    第一个函数,Mp3Info mp3Info = new Mp3Info();
    对象在for循环外面创建的,for循环里面操作的是同一个Mp3Info对象,所以第一个函数的第二条打印语句,应该list里面只有一条数据。第二个函数,对象在for循环里面创建的,每一次循环都新建一个对象,然后将这个对象加入到list中第二个才是正确的
      

  2.   

    肯定得宰循环里啊,Lz想想,你要获取的mp3对象 你都不知道是哪个,你怎么能先建立mp3的对象呢,只有符合你的判断条件的时候 你才会创建当前这个符合你条件的mp3对象。
      

  3.   

    这就好比,把mp3Info想象成一个学生,mp3Name是他的名字,mp3Size是他的身高
    而mp3Infos是一个报名表
    每次setMp3Name是去派出所改名字,setMp3Size是身高变高了。
    即使你每次改完名字之后,再去报一次名(add),最后,点名的时候,报名表中所有人的最新状态必然是一样的。
      

  4.   

    肯定是在for循环中加上Mp3Info mp3Info = new Mp3Info();这样每次遍历才可以add进去
    你把Mp3Info mp3Info = new Mp3Info();放到外面取每次都是指定的一个对象,当然只有一条了
      

  5.   

    1.Mp3Info mp3Info = new Mp3Info();写在循环外面的话,你循环里添加mp3info对象,每次都是添加这个对象,他不会重新new一个对象出来,程序一直在循环就会覆盖mp3Info这个对象里面存的值,所以每次都放最后的值,所以程序最后输出集合里的所有mp3Info对象都是一样的数据。!!!!!!
    2.Mp3Info mp3Info = new Mp3Info();写在循环里面的话,他每次循环会重新new一个对象出来,存放在集合中,所以每次得到的结果就是你想要的!!