2016-07-09 5 views
0

Ich bin neu in Android. Ich greife auf eine ArrayList von einer anderen Klasse zu, aber beim Zugriff auf die Klasse bekomme ich keine Größe von ArrayList. In der Hauptklasse zeigt es einen positiven Wert der Größe der Array-Liste. Ich weiß nicht, warum ich null Größe beim Zugreifen auf die Klasse bekomme. Überprüfen Sie meinen Code auf Fehler.Holen ArrayList Größe Null beim Zugriff von einer anderen Klasse

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()); 
     }System.out.println(trackslist.size()); 
    } 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); 
} 
} 

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(); 
    System.out.println("songsListSize"+songsList.size()); 
    System.out.println("List" +songsList); 

} 
+2

Ist das nicht offensichtlich? Sie instanziieren eine neue Instanz von * Tab3Tracks *, sodass die ArrayLists offensichtlich leer sind, da keine Lifecycle-Methode ausgelöst wird. Um auf Daten von dem Fragment zuzugreifen, sollten Sie den FragmentManager verwenden, um das Fragment zu erhalten, und dann die entsprechende Methode aufrufen. Siehe zum Beispiel [diese Frage] (http://stackoverflow.com/questions/10903077/calling-a-fragment-method-from-a-parent-activity) – reVerse

Antwort

0

Ihre ArrayList wird initialisiert, aber nichts wird jemals hinzugefügt.

trackslist.add(cursor.getString(trackIndex)); 

Das ist in onCreateView verschachtelt, so dass es nur einmal aufgerufen wird. Sie sollten in Erwägung ziehen, onOuchListener zur Aktivität hinzuzufügen und Ihren Code dort im Listener hinzuzufügen, damit er bei jeder Berührung des Bildschirms aktualisiert wird.

Hinzufügen in einem Thread funktioniert möglicherweise auch, aber es hängt wirklich von Ihrem Code ab.

0

onCreateView von Tab3Tracks wird von Android aufgerufen werden, wenn Fragment, das eine Ansicht aufblasen, so ist das Array leer, weil dieser Code

trackslist.add(cursor.getString(trackIndex)); 

ruft nicht zu jeder Zeit an