【问题标题】:How to show audio files in a listview in Android?如何在 Android 的列表视图中显示音频文件?
【发布时间】:2012-03-20 06:16:56
【问题描述】:

我在SD card 的特定目录中有一些音频文件。我需要在 Android 的列表视图中显示他们的名字,如果我想播放或删除该特定文件,我可以通过该列表视图执行此操作吗?我该怎么做?

public class MyPerformanceArrayAdapter extends ArrayAdapter<String> {
    private final Context context;
    private final String[] values;

    public MyPerformanceArrayAdapter(Context context, String[] values) {
        super(context, R.layout.main, values);
        this.context = context;
        this.values = values;
    }           

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.main, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.label);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
        textView.setText(values[position]);
        // Change the icon for Windows and iPhone
        String s = values[position];
        if (s.startsWith("Windows7") || s.startsWith("iPhone")
                || s.startsWith("Solaris")) {
            //imageView.setImageResource(R.drawable.no);
        } else {
            //imageView.setImageResource(R.drawable.ok);
        }    
        return rowView;
    }
}

public class SimpleListActivity extends ListActivity {
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
                "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
                "Linux", "OS/2" };
        MyPerformanceArrayAdapter adapter = new MyPerformanceArrayAdapter(this, values);
        setListAdapter(adapter);
    }    
}

这段代码是一个简单的列表视图。我需要将它们的名称从特定目录中获取到适配器类。我该怎么做?

如果我对该特定文件进行任何更改,这些都应反映在列表视图中。

【问题讨论】:

    标签: android listview audio android-layout


    【解决方案1】:
    public class ReadAllFilesFromPathActivity extends Activity {
        /** Called when the activity is first created. */
        private List<String> myList;
        File file;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            ListView listView = (ListView) findViewById(R.id.mylist);
            myList = new ArrayList<String>();
    
            File directory = Environment.getExternalStorageDirectory();
            file = new File( directory + "/Test" );
            File list[] = file.listFiles();
    
            for( int i=0; i< list.length; i++)
            {
                    myList.add( list[i].getName() );
            }
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, android.R.id.text1, myList);
            listView.setAdapter(adapter); //Set all the file in the list.
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以检查使用以下代码在 listView 中显示所有音频文件并单击您播放的任何一个..

      public class AudioListActivity extends Activity {
      ListView musiclist;
      Cursor musiccursor;
      int music_column_index;
      int count;
      MediaPlayer mMediaPlayer;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          // TODO Auto-generated method stub
          super.onCreate(savedInstanceState);
          setContentView(R.layout.audiolist_activity);
          init_phone_music_grid();
      }
      private void init_phone_music_grid() {
          System.gc();
          String[] proj = { MediaStore.Audio.Media._ID,MediaStore.Audio.Media.DATA,
                              MediaStore.Audio.Media.DISPLAY_NAME,MediaStore.Video.Media.SIZE };
      
          musiccursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,proj, null, null, null);
      
          count = musiccursor.getCount();
          musiclist = (ListView) findViewById(R.id.PhoneMusicList);
          musiclist.setAdapter(new MusicAdapter(getApplicationContext()));
      
          musiclist.setOnItemClickListener(musicgridlistener);
          mMediaPlayer = new MediaPlayer();
      }
      
      private OnItemClickListener musicgridlistener = new OnItemClickListener() {
          public void onItemClick(AdapterView parent, View v, int position,long id) {
              System.gc();
              music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
              musiccursor.moveToPosition(position);
              String filename = musiccursor.getString(music_column_index);
      
              try {
                  if (mMediaPlayer.isPlaying()) {
                      mMediaPlayer.reset();
                  }
                  mMediaPlayer.setDataSource(filename);
                  mMediaPlayer.prepare();
                  mMediaPlayer.start();
              } catch (Exception e) {
      
              }
          }
      };
      
      public class MusicAdapter extends BaseAdapter {
          private Context mContext;
      
          public MusicAdapter(Context c) {
              mContext = c;
          }
      
          public int getCount() {
              return count;
          }
      
          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();
              TextView tv = new TextView(mContext.getApplicationContext());
              String id = null;
              if (convertView == null) {
                  music_column_index = musiccursor
                          .getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
                  musiccursor.moveToPosition(position);
                  id = musiccursor.getString(music_column_index);
                  music_column_index = musiccursor
                          .getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE);
                  musiccursor.moveToPosition(position);
                  id += " Size(KB):" + musiccursor.getString(music_column_index);
                  tv.setText(id);
              } else
                  tv = (TextView) convertView;
              return tv;
          }
      }
      

      }

      【讨论】:

        【解决方案3】:

        我假设您可以在列表中正确显示这些文件。

        接下来,创建显示打开和删除的菜单:

        public final static int MENU_OPEN = 0;
        public final static int MENU_DELETE = 1;
        
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        
                    menu.add(0, MENU_OPEN, 0, "Open");
                    menu.add(0, MENU_DELETE, 1, "Delete");
        }
        

        然后,听 onContextItemSelected 进行菜单按下:

        @Override
        public boolean onContextItemSelected(MenuItem item) {
        
            AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
            String filename = <Your File List>.get(info.position);
        
            switch(item.getItemId()) {
        
            case MENU_OPEN:
              Intent intent = new Intent();
              intent.setAction(android.content.Intent.ACTION_VIEW);
              File file = new File(filename);
              intent.setDataAndType(Uri.fromFile(file), "<Your MIME Type>");
              startActivity(intent);
              break;
            case MENU_DELETE:
              File file = new File(filename);
              file.delete();
              break;
            }
        }
        

        最后,要实时监控目录,你应该实现一个 FileObserver。

        http://developer.android.com/reference/android/os/FileObserver.html

        【讨论】:

        • 我需要从列表视图中播放和删除特定文件
        • 我进行了更新。您可以获得用户按下的位置。然后你可以根据位置从文件列表中获取文件名。
        【解决方案4】:

        在您的文件所在的目录中使用java.io.File 对象:

        File dir = new File( "path to dir");
        String[] fileNames = dir.list();
        

        如果你只想要其中的一部分,你甚至可以使用过滤器:

        String[] fileNames = dir.list( new FilenNameFilter() {
            @Override
            public void accept(File dir, String name) {
                return name.startWith( "Foo");
           } //met
        });
        

        【讨论】:

        • 如果我想通过 android.listview 播放和删除该特定文件。我该怎么做?
        • lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView> parent, View view, int position, long id) { //delete track at position } });
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多