我正在创建一个我自己的Android音乐播放器。我想要将所有音乐文件从库加载到我的文件夹,以便我可以将其中一些添加到我的收藏夹中。但是,问题是,当我从图库中获取文件时,它会重复。即。列表在我的文件夹中显示三次或四次。你能检查一下是否有任何逻辑错误?谢谢你:)
public ArrayList<String> getFromSdcard(String folderName)
{
ArrayList<String> audioFileLists = new ArrayList<String>();
File file= new File(folderName);
if (file.isDirectory())
{
File[] listFile = file.listFiles();//get list of files
for (int i = 0; i < listFile.length; i++)
{
String path = listFile[i].getAbsolutePath();
audioFileLists.add(path);//add path of files to array list
}
}
return audioFileLists;
}
private class MusicAdapter extends BaseAdapter {
private ArrayList<String> audioFile;
public MusicAdapter( ArrayList<String> audioFiles) {
audioFile = audioFiles;
}
public int getCount() {
return audioFile.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
System.gc();
LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.musiclist, null);
TextView albumName = (TextView) convertView.findViewById(R.id.albumName);
String fileName = audioFile.get(position);
albumName.setText(fileName.substring(fileName.lastIndexOf("/")+1));
return convertView;
}
}
尝试使用ViewHold后,这是我的logcat。
11-12 11:14:26.043: I/Ads(513): Request scenario: Online server request.
11-12 11:14:27.313: W/webcore(513): Can't get the viewWidth after the first layout
11-12 11:14:27.413: D/webviewglue(513): nativeDestroy view: 0x3053b8
11-12 11:14:27.423: I/Ads(513): onReceiveAd()
11-12 11:14:27.523: D/webviewglue(513): nativeDestroy view: 0x32d048
11-12 11:15:05.163: D/dalvikvm(513): GC_EXPLICIT freed 6162 objects / 466624 bytes in 111ms
11-12 11:28:53.443: D/dalvikvm(513): GC_FOR_MALLOC freed 20535 objects / 582840 bytes in 124ms
11-12 11:42:38.213: D/dalvikvm(513): GC_FOR_MALLOC freed 20821 objects / 523728 bytes in 117ms
11-12 11:56:20.473: D/dalvikvm(513): GC_FOR_MALLOC freed 20837 objects / 524536 bytes in 129ms
答案 0 :(得分:1)
首先检查您的ArrayList,即fileLists不包含任何重复值,如下所示
public ArrayList<String> getFromSdcard(String folderName) {
ArrayList<String> audioFileLists = new ArrayList<String>();
File file = new File(Environment.getExternalStorageDirectory()+"/"+folderName);
if (file.isDirectory()) {
File[] listFile = file.listFiles();// get list of files
for (int i = 0; i < listFile.length; i++) {
String path = listFile[i].getAbsolutePath();
audioFileLists.add(path);// add path of files to array list
}
}
Log.d("audioFileLists:" + audioFileLists.size(), ""); // Check the Size of the List
return audioFileLists;
}
并打印audioFileLists中的值以确保您的arraylist不包含重复值
public void print(ArrayList<String> audioFileLists) {
for (int i = 0; i < audioFileLists.size(); i++) {
System.out.println("files:" + audioFileLists.get(i));
}
}
如果ArrayList包含重复,请使用以下方法从ArrayList中删除重复项,我们可以使用Hashset删除ArrayList的副本,如下所示。
public ArrayList<String> removeDuplicates(ArrayList<String> audioFileLists){
HashSet<String> listToSet = new HashSet<String>(
audioFileLists);
audioFileLists.clear();
audioFileLists.addAll(listToSet);
return audioFilesLists;
}
现在再次调用我们上面写的print方法以确保删除重复项。如果ArrayList没有重复,则问题在于使用Adpater。
众所周知,适配器的工作是准备要在ListView中显示的数据集中每个元素的视图。这往往涉及许多findViewById(int)查找,这些查询在CPU时间上非常昂贵,而且我相信这里发生了重复。
适用于Android的常规最佳实践规定,适配器使用称为ViewHolder模式的东西来降低这些查找的成本,并消除重复问题。
我在这里解释了如何使用View Holder模式。
public class MusicAdapter extends BaseAdpater{
private ArrayList<String> audioFile;
LayoutInflater mInflater =null;
public MusicAdapter( ArrayList<String> audioFiles,Context dcontextObject) {
audioFile = audioFiles;
mInflater = LayoutInflater.from(dcontextObject);
}
public int getCount() {
return audioFile.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
// Create an Object for View Holder
ViewHolder holder;
if(convertView == null){
convertView = mInflater.inflate(R.layout.musiclist, null);
holder.albumName = (TextView) convertView.findViewById(R.id.albumName);
}
else{
holder = (ViewHolder) convertView .getTag();
}
holder.albumName.setText(fileName.substring(audioFile.get(position).lastIndexOf("/")+1));
return convertView;
}// End of getView()
// create View Holder class here
class ViewHolder {
TextView albumName;
}
}// End of Adapter