2016-02-12 71 views
2

我是一名初學者,當我添加音樂文件到SD卡時,我的音樂應用程序中的列表視圖不更新,直到我重新啓動設備或我的genymotion模擬器。而歌曲也在玩着落後。Android列表視圖不更新

這裏是我的主要Acivity.java代碼:

import com.techdsk.musicdsk.musicdsk.adapter.CustomAdapter; 
import com.techdsk.musicdsk.musicdsk.controls.Controls; 
import com.techdsk.musicdsk.musicdsk.service.SongService; 
import com.techdsk.musicdsk.musicdsk.util.MediaItem; 
import com.techdsk.musicdsk.musicdsk.util.PlayerConstants; 
import com.techdsk.musicdsk.musicdsk.util.UtilFunctions; 

public class MainActivity extends Activity { 
    String LOG_CLASS = "MainActivity"; 
    CustomAdapter customAdapter = null; 
    static TextView playingSong; 
    Button btnPlayer; 
    static Button btnPause, btnPlay, btnNext, btnPrevious; 
    Button btnStop; 
    LinearLayout mediaLayout; 
    static LinearLayout linearLayoutPlayingSong; 
    ListView mediaListView; 
    ProgressBar progressBar; 
    TextView textBufferDuration, textDuration; 
    static ImageView imageViewAlbumArt; 
    static Context context; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getActionBar().hide(); 
     setContentView(R.layout.activity_main); 
     context = MainActivity.this; 
     init(); 
    } 

    private void init() { 
     getViews(); 
     setListeners(); 
     playingSong.setSelected(true); 
     progressBar.getProgressDrawable().setColorFilter(getResources().getColor(R.color.white), Mode.SRC_IN); 
     if(PlayerConstants.SONGS_LIST.size() <= 0){ 
      PlayerConstants.SONGS_LIST = UtilFunctions.listOfSongs(getApplicationContext()); 
     } 
     setListItems(); 
    } 

    private void setListItems() { 
     customAdapter = new CustomAdapter(this,R.layout.custom_list, PlayerConstants.SONGS_LIST); 
     mediaListView.setAdapter(customAdapter); 
     mediaListView.setFastScrollEnabled(true); 
    } 

    private void getViews() { 
     playingSong = (TextView) findViewById(R.id.textNowPlaying); 
     btnPlayer = (Button) findViewById(R.id.btnMusicPlayer); 
     mediaListView = (ListView) findViewById(R.id.listViewMusic); 
     mediaLayout = (LinearLayout) findViewById(R.id.linearLayoutMusicList); 
     btnPause = (Button) findViewById(R.id.btnPause); 
     btnPlay = (Button) findViewById(R.id.btnPlay); 
     linearLayoutPlayingSong = (LinearLayout) findViewById(R.id.linearLayoutPlayingSong); 
     progressBar = (ProgressBar) findViewById(R.id.progressBar); 
     btnStop = (Button) findViewById(R.id.btnStop); 
     textBufferDuration = (TextView) findViewById(R.id.textBufferDuration); 
     textDuration = (TextView) findViewById(R.id.textDuration); 
     imageViewAlbumArt = (ImageView) findViewById(R.id.imageViewAlbumArt); 
     btnNext = (Button) findViewById(R.id.btnNext); 
     btnPrevious = (Button) findViewById(R.id.btnPrevious); 
    } 

    private void setListeners() { 
     mediaListView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
      @Override 
      public void onItemClick(AdapterView<?> parent, View item, int position, long id){ 
       Log.d("TAG", "TAG Tapped INOUT(IN)"); 
       PlayerConstants.SONG_PAUSED = false; 
       PlayerConstants.SONG_NUMBER = position; 
       boolean isServiceRunning = UtilFunctions.isServiceRunning(SongService.class.getName(), getApplicationContext()); 
       if (!isServiceRunning) { 
        Intent i = new Intent(getApplicationContext(),SongService.class); 
        startService(i); 
       } else { 
        PlayerConstants.SONG_CHANGE_HANDLER.sendMessage(PlayerConstants.SONG_CHANGE_HANDLER.obtainMessage()); 
       } 
       updateUI(); 
       changeButton(); 
       Log.d("TAG", "TAG Tapped INOUT(OUT)"); 
      } 
     }); 

     btnPlayer.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(MainActivity.this,AudioPlayerActivity.class); 
       startActivity(i); 
      } 
     }); 
     btnPlay.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Controls.playControl(getApplicationContext()); 
      } 
     }); 
     btnPause.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Controls.pauseControl(getApplicationContext()); 
      } 
     }); 
     btnNext.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Controls.nextControl(getApplicationContext()); 
      } 
     }); 
     btnPrevious.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Controls.previousControl(getApplicationContext()); 
      } 
     }); 
     btnStop.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(getApplicationContext(), SongService.class); 
       stopService(i); 
       linearLayoutPlayingSong.setVisibility(View.GONE); 
      } 
     }); 
     imageViewAlbumArt.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(MainActivity.this,AudioPlayerActivity.class); 
       startActivity(i); 
      } 
     }); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     try{ 
      boolean isServiceRunning = UtilFunctions.isServiceRunning(SongService.class.getName(), getApplicationContext()); 
      if (isServiceRunning) { 
       updateUI(); 
      }else{ 
       linearLayoutPlayingSong.setVisibility(View.GONE); 
      } 
      changeButton(); 
      PlayerConstants.PROGRESSBAR_HANDLER = new Handler(){ 
       @Override 
       public void handleMessage(Message msg){ 
        Integer i[] = (Integer[])msg.obj; 
        textBufferDuration.setText(UtilFunctions.getDuration(i[0])); 
        textDuration.setText(UtilFunctions.getDuration(i[1])); 
        progressBar.setProgress(i[2]); 
       } 
      }; 
     }catch(Exception e){} 
    } 

    @SuppressWarnings("deprecation") 
    public static void updateUI() { 
     try{ 
      MediaItem data = PlayerConstants.SONGS_LIST.get(PlayerConstants.SONG_NUMBER); 
      playingSong.setText(data.getTitle() + " " + data.getArtist() + "-" + data.getAlbum()); 
      Bitmap albumArt = UtilFunctions.getAlbumart(context, data.getAlbumId()); 
      if(albumArt != null){ 
       imageViewAlbumArt.setBackgroundDrawable(new BitmapDrawable(albumArt)); 
      }else{ 
       imageViewAlbumArt.setBackgroundDrawable(new BitmapDrawable(UtilFunctions.getDefaultAlbumArt(context))); 
      } 
      linearLayoutPlayingSong.setVisibility(View.VISIBLE); 
     }catch(Exception e){} 
    } 

    public static void changeButton() { 
     if(PlayerConstants.SONG_PAUSED){ 
      btnPause.setVisibility(View.GONE); 
      btnPlay.setVisibility(View.VISIBLE); 
     }else{ 
      btnPause.setVisibility(View.VISIBLE); 
      btnPlay.setVisibility(View.GONE); 
     } 
    } 

    public static void changeUI(){ 
     updateUI(); 
     changeButton(); 
    } 
} 

這是我Audioplayer Activity.java代碼:

package com.techdsk.musicdsk.musicdsk; 


     import android.app.Activity; 
     import android.content.Context; 
     import android.graphics.Bitmap; 
     import android.graphics.PorterDuff.Mode; 
     import android.graphics.drawable.BitmapDrawable; 
     import android.os.Bundle; 
     import android.os.Handler; 
     import android.os.Message; 
     import android.view.View; 
     import android.view.View.OnClickListener; 
     import android.widget.Button; 
     import android.widget.LinearLayout; 
     import android.widget.ProgressBar; 
     import android.widget.TextView; 
     import com.techdsk.musicdsk.musicdsk.controls.Controls; 
     import com.techdsk.musicdsk.musicdsk.service.SongService; 
     import com.techdsk.musicdsk.musicdsk.util.PlayerConstants; 
     import com.techdsk.musicdsk.musicdsk.util.UtilFunctions; 

public class AudioPlayerActivity extends Activity { 

    Button btnBack; 
    static Button btnPause; 
    Button btnNext; 
    static Button btnPlay; 
    static TextView textNowPlaying; 
    static TextView textAlbumArtist; 
    static TextView textComposer; 
    static LinearLayout linearLayoutPlayer; 
    ProgressBar progressBar; 
    static Context context; 
    TextView textBufferDuration, textDuration; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getActionBar().hide(); 
     setContentView(R.layout.audio_player); 
     context = this; 
     init(); 
    } 

    private void init() { 
     getViews(); 
     setListeners(); 
     progressBar.getProgressDrawable().setColorFilter(getResources().getColor(R.color.white), Mode.SRC_IN); 
     PlayerConstants.PROGRESSBAR_HANDLER = new Handler(){ 
      @Override 
      public void handleMessage(Message msg){ 
       Integer i[] = (Integer[])msg.obj; 
       textBufferDuration.setText(UtilFunctions.getDuration(i[0])); 
       textDuration.setText(UtilFunctions.getDuration(i[1])); 
       progressBar.setProgress(i[2]); 
      } 
     }; 
    } 

    private void setListeners() { 
     btnBack.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Controls.previousControl(getApplicationContext()); 
      } 
     }); 

     btnPause.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Controls.pauseControl(getApplicationContext()); 
      } 
     }); 

     btnPlay.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Controls.playControl(getApplicationContext()); 
      } 
     }); 

     btnNext.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Controls.nextControl(getApplicationContext()); 
      } 
     }); 
    } 

    public static void changeUI(){ 
     updateUI(); 
     changeButton(); 
    } 

    private void getViews() { 
     btnBack = (Button) findViewById(R.id.btnBack); 
     btnPause = (Button) findViewById(R.id.btnPause); 
     btnNext = (Button) findViewById(R.id.btnNext); 
     btnPlay = (Button) findViewById(R.id.btnPlay); 
     textNowPlaying = (TextView) findViewById(R.id.textNowPlaying); 
     linearLayoutPlayer = (LinearLayout) findViewById(R.id.linearLayoutPlayer); 
     textAlbumArtist = (TextView) findViewById(R.id.textAlbumArtist); 
     textComposer = (TextView) findViewById(R.id.textComposer); 
     progressBar = (ProgressBar) findViewById(R.id.progressBar); 
     textBufferDuration = (TextView) findViewById(R.id.textBufferDuration); 
     textDuration = (TextView) findViewById(R.id.textDuration); 
     textNowPlaying.setSelected(true); 
     textAlbumArtist.setSelected(true); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     boolean isServiceRunning = UtilFunctions.isServiceRunning(SongService.class.getName(), getApplicationContext()); 
     if (isServiceRunning) { 
      updateUI(); 
     } 
     changeButton(); 
    } 

    public static void changeButton() { 
     if(PlayerConstants.SONG_PAUSED){ 
      btnPause.setVisibility(View.GONE); 
      btnPlay.setVisibility(View.VISIBLE); 
     }else{ 
      btnPause.setVisibility(View.VISIBLE); 
      btnPlay.setVisibility(View.GONE); 
     } 
    } 

    private static void updateUI() { 
     try{ 
      String songName = PlayerConstants.SONGS_LIST.get(PlayerConstants.SONG_NUMBER).getTitle(); 
      String artist = PlayerConstants.SONGS_LIST.get(PlayerConstants.SONG_NUMBER).getArtist(); 
      String album = PlayerConstants.SONGS_LIST.get(PlayerConstants.SONG_NUMBER).getAlbum(); 
      String composer = PlayerConstants.SONGS_LIST.get(PlayerConstants.SONG_NUMBER).getComposer(); 
      textNowPlaying.setText(songName); 
      textAlbumArtist.setText(artist + " - " + album); 
      if(composer != null && composer.length() > 0){ 
       textComposer.setVisibility(View.VISIBLE); 
       textComposer.setText(composer); 
      }else{ 
       textComposer.setVisibility(View.GONE); 
      } 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
     try{ 
      long albumId = PlayerConstants.SONGS_LIST.get(PlayerConstants.SONG_NUMBER).getAlbumId(); 
      Bitmap albumArt = UtilFunctions.getAlbumart(context, albumId); 
      if(albumArt != null){ 
       linearLayoutPlayer.setBackgroundDrawable(new BitmapDrawable(albumArt)); 
      }else{ 
       linearLayoutPlayer.setBackgroundDrawable(new BitmapDrawable(UtilFunctions.getDefaultAlbumArt(context))); 
      } 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

自定義適配器的.java代碼:

package com.techdsk.musicdsk.musicdsk.adapter; 

import java.util.ArrayList; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.TextView; 
import com.techdsk.musicdsk.musicdsk.R; 
import com.techdsk.musicdsk.musicdsk.util.MediaItem; 
import com.techdsk.musicdsk.musicdsk.util.UtilFunctions; 

public class CustomAdapter extends ArrayAdapter<MediaItem>{ 

    ArrayList<MediaItem> listOfSongs; 
    Context context; 
    LayoutInflater inflator; 

    public CustomAdapter(Context context, int resource, ArrayList<MediaItem> listOfSongs) { 
     super(context, resource, listOfSongs); 
     this.listOfSongs = listOfSongs; 
     this.context = context; 
     inflator = LayoutInflater.from(context); 
    } 

    private class ViewHolder{ 
     TextView textViewSongName, textViewArtist, textViewDuration; 
    } 

    ViewHolder holder; 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View myView = convertView; 
     if(convertView == null){ 
      myView = inflator.inflate(R.layout.custom_list, parent, false); 
      holder = new ViewHolder(); 
      holder.textViewSongName = (TextView) myView.findViewById(R.id.textViewSongName); 
      holder.textViewArtist = (TextView) myView.findViewById(R.id.textViewArtist); 
      holder.textViewDuration = (TextView) myView.findViewById(R.id.textViewDuration); 
      myView.setTag(holder); 
     }else{ 
      holder = (ViewHolder)myView.getTag(); 
     } 
     MediaItem detail = listOfSongs.get(position); 
     holder.textViewSongName.setText(detail.toString()); 
     holder.textViewArtist.setText(detail.getAlbum() + " - " + detail.getArtist()); 
     holder.textViewDuration.setText(UtilFunctions.getDuration(detail.getDuration())); 
     return myView; 
    } 
} 
+0

? – droidev

+0

@driodev是的,那是我的問題 – Rohith

+0

當你重新啓動你的應用程序時會發生什麼? – droidev

回答

2

時您添加可以使用NotifyDatasetChanged()的文件。這會告訴你的適配器刷新它的數據。因此,在添加新文件後更新源數組時,可以調用NotifyDatasetChanged()方法。

as Ex。如果在適配器中有一個名爲Add()的方法,那麼。

public void Add (item e){ 
items.add (e); 
NotifyDatasetChanged(); 
} 

將刷新您的數據。

0

您的列表是沒有得到更新,因爲它沒有被通知的數據變化,

ADW的文檔解釋:

notifyDataSetChanged()通知所附的觀察者的 的基礎數據已已被更改,並且反映數據集 的任何視圖都應該自行刷新。

解決方案

通知侑適配器:

customAdapter.notifyDataSetChanged(); 
要在文件添加到SD卡更新您的音樂列表
+0

可以üPLZ告訴我在我的上面的代碼PLZ中添加該行的位置? – Rohith

+0

是的,在意向過濾器中進行,無論您獲得有關SD卡中數據更改的廣播通知。 :) –

+0

補充說,但沒有用 – Rohith