1

I am new to Android. I am accessing an ArrayList from another class but i am getting zero size of ArrayList in accessing class. In main class, it shows a positive value of size of array list. I dont know why i am getting zero size in accessing class. Check my code for mistakes.

Tab3Tracks Class

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 Class

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);

}
Akshay Sharma
  • 65
  • 1
  • 9
  • 2
    Isn't this one obvious? You're instantiating a new instance of *Tab3Tracks* so the ArrayLists is obviously empty since no lifecycle method is triggered. In order to access data from the `Fragment` you should use the `FragmentManager` to get the Fragment and then call the corresponding method. See for example [this question](http://stackoverflow.com/questions/10903077/calling-a-fragment-method-from-a-parent-activity) – reVerse Jul 09 '16 at 08:32

2 Answers2

0

onCreateView of Tab3Tracks will be called by android if fragment will inflate a view, so your array is empty because this code

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

doesn't call anytime

Hayk Petrosyan
  • 363
  • 1
  • 6
0

Your ArrayList is initialized, but nothing is ever added.

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

That is nested inside onCreateView, causing it to only be called once. You might want to consider adding onTOuchListener to the activity and add your code there inside the listener so it updates whenever the screen is touched.

Adding inside a thread might work too, but it really depends on your code.

Zoe
  • 27,060
  • 21
  • 118
  • 148