0

私はアンドロイドで自分の音楽プレーヤーを作成する途中でした。いくつかの音楽ファイルをお気に入りに追加できるように、すべての音楽ファイルをギャラリーからフォルダーにロードしたくありません。しかし、問題は、ギャラリーからファイルを取得している間、それが繰り返されることです。すなわち。リストがフォルダーに 3 回または 4 回表示されます。論理エラーがないか確認していただけますか?? ありがとうございました :)

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
4

1 に答える 1

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 の値を出力します。

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
于 2013-11-11T07:07:53.673 に答える