2016-07-08 6 views
0

Ich erstelle eine Musik-Player-App. Ich habe zwei Klassen namens "Tab3Tracks" und "NowPlaying". In der Klasse "Tab3Tacks" werden Songs in ListView geladen. Wenn also jemand auf einen Song klickt, sendet er die Position dieses Songs an eine andere Klasse, so dass eine andere Klasse diesen Song spielen kann. Aber ich bekomme Fehler beim Klicken auf Lied. Ich weiß nicht, wo ich Fehler mache. In Logcat erhielt ich den Fehler "Ungültiger Index 0, Größe ist 0" in der NowPlaying-Klasse. Ich poste LogCat Fehlercode. Überprüfen Sie meinen Code auf Fehler. Danke im Voraus.Ungültiger Index ist Null beim Abspielen von Song

Tab3Tracks Klasse

public class Tab3Tracks extends ListFragment { 


public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
} 

private ArrayList<String> trackslist = new ArrayList<>(); 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.tab3tracks, container, false); 


    final String trackid = MediaStore.Audio.Media._ID; 
    final String trackno = MediaStore.Audio.Media.TRACK; 
    final String trackname = MediaStore.Audio.Media.TITLE; 
    final String path = MediaStore.Audio.Media.DATA; 
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 

    ContentResolver cr = getContext().getContentResolver(); 
    final String[] projection = {trackid,trackno,trackname,path 
    }; 
    final Cursor cursor = cr.query(uri,projection,null,null,null); 
    if (cursor!=null){ 
     if(cursor.moveToFirst()){ 
      do{ 
       int trackIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE); 
       trackslist.add(cursor.getString(trackIndex)); 
      }while(cursor.moveToNext()); 
     } 
    } cursor.close(); 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(
      getActivity(),R.layout.playlist_item,R.id.songTitle,trackslist 
    ); 
    setListAdapter(adapter); 
    return v; 
} 


public ArrayList<String> getList(){ 
    return trackslist; 
} 



@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    int songIndex = position; 

    // Starting new intent 
    Intent in = new Intent(getActivity(), NowPlaying.class); 
    // Sending songIndex to PlayerActivity 
    in.putExtra("songIndex", songIndex); 
    startActivityForResult(in, 100); 
    getActivity().finish(); 
} 
} 

NowPlaying Klasse

public class NowPlaying extends AppCompatActivity { 

    public ArrayList<String> songsList = new ArrayList<String>(); 
    public Tab3Tracks tab3tracks; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.player); 
    // Getting all songs list 
    tab3tracks = new Tab3Tracks(); 
    songsList= tab3tracks.getList(); 


    // By default play first song 
    playSong(0); 

} 



/** 
* Receiving song index from playlist view 
* and play the song 
*/ 
@Override 
protected void onActivityResult(int requestCode, 
           int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == 100) { 
     currentSongIndex = data.getExtras().getInt("songIndex"); 
     // play selected song 
     playSong(currentSongIndex); 
    } 

} 

/** 
* Function to play a song 
* 
* @param songIndex - index of song 
*/ 
public void playSong(int songIndex) { 
    // Play song 
    try { 
     mp.reset(); 
     mp.setDataSource(songsList.get(songIndex)); 
     mp.prepare(); 
     mp.start(); 
     // Displaying Song title 
     String songTitle = songsList.get(songIndex); 
     songTitleLabel.setText(songTitle); 

     // Changing Button Image to pause image 
     btnPlay.setImageResource(R.drawable.btn_pause); 

     // set Progress bar values 
     songProgressBar.setProgress(0); 
     songProgressBar.setMax(100); 

     // Updating progress bar 
     updateProgressBar(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

LogCat Fehler

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.digital.thefearstuff.tfsmusicplayer/com.digital.thefearstuff.tfsmusicplayer.NowPlaying}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2450) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2520) 
     at android.app.ActivityThread.-wrap11(ActivityThread.java) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5466) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
     at java.util.ArrayList.get(ArrayList.java:308) 
     at com.digital.thefearstuff.tfsmusicplayer.NowPlaying.playSong(NowPlaying.java:286) 
     at com.digital.thefearstuff.tfsmusicplayer.NowPlaying.onCreate(NowPlaying.java:83) 
     at android.app.Activity.performCreate(Activity.java:6251) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2403) 

Antwort

1

Tanne Bitte vermeiden Sie Fragen wie Warum funktioniert dieser Code nicht? Suche Debug-Hilfe, da sie dazu neigen, eine Menge von Downvotes zu bekommen und sind in der Regel schnell geschlossen. Versuchen Sie immer, Ihr Problem zu minimieren und zu isolieren. Debuggen Sie selbst und sehen Sie How to create a Minimal, Complete, and Verifiable example für zukünftige Beiträge.

Jetzt hier zu hinterfragen, in playSong(0) versuchen Sie Element in 0 Position zuzugreifen, aber die Liste ist leer und es gibt keine solche Position, daher IndexOutOfBounds.

at com.digital.thefearstuff.tfsmusicplayer.NowPlaying.playSong(NowPlaying.java:286) 
    at com.digital.thefearstuff.tfsmusicplayer.NowPlaying.onCreate(NowPlaying.java:83) 

Ihre songsList ist, wie es sich herausstellt - leer. Das bedeutet wiederum, dass trackslist leer ist. Was für sich könnte dazu führen, dass cursornull und überspringt die add-while-Schleife. Aber das sollten Sie selbst debuggen, da Sie nur den ganzen Code haben.

es zu debuggen: ein else und Log mit dem if (cursor != null){ wie

if (cursor!=null){ 
    if(cursor.moveToFirst()){ 
     do{ 
      int trackIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE); 
      trackslist.add(cursor.getString(trackIndex)); 
     }while(cursor.moveToNext()); 
    } 
} else { 
    Log.d("cursor", "null"); 
} 
cursor.close(); 

und sucht es in der logcat hinzufügen.

+0

Ich habe versucht, die Größe der Array-Liste in beiden Klassen zu überprüfen ... In der Klasse "Tab3tracks" zeigt es einen positiven Wert, aber in "NowPlaying" -Klasse zeigt es die Größe Null. –

+0

Haben Sie das Fragment dem Layout Ihrer Aktivität hinzugefügt, dann [Erstellen eines Fragments] (https://developer.android.com/training/basics/fragments/creating.html#AddInLayout) und * Hinzufügen eines Fragments zu einer Aktivität * und * Splitter * von [hier] verwalten (https://developer.android.com/guide/components/fragments.html)? – user8

Verwandte Themen