2016-02-12 4 views
2

Я новичок. Когда я добавляю музыкальные файлы на Sd-карту, просмотр списка в приложении «Моя музыка» не обновляется до тех пор, пока я не перезагружу устройство или мой эмулятор genymotion. и песни также играют с отставанием.Android View View не обновляется

Вот мой главный 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().

как пример. если у вас есть метод Add() внутри вашего адаптера.

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

обновит ваши данные.

0

Ваш список не получает обновляется, так как не сообщается об изменении данных,

документация в ADW объясняет:

notifyDataSetChanged() оповещает присоединенные наблюдатель, что базовых данных был изменен, и любой вид, отражающий набор данных , должен обновиться.

Решение

Уведомлять YOR адаптер:

customAdapter.notifyDataSetChanged(); 
+0

can u plz скажите мне, где добавить эту строку в мой код выше plz? – Rohith

+0

Да, сделайте это в фильтре намерения, где бы вы ни получили широковещательное уведомление об изменении данных на SD-карте. :) –

+0

добавил, что, но не использовать – Rohith

Смежные вопросы