2016-07-09 27 views
0

我是Android新手。我正从另一个类访问一个ArrayList,但是我在访问类时获得了零大小的ArrayList。在主类中,它显示了数组列表大小的正值。我不知道为什么我在上课时得到零号。检查我的代码是否有错误。从另一个类访问ArrayList大小为零

Tab3Tracks类

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类

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

这不明显吗?您正在实例化* Tab3Tracks *的新实例,因此ArrayLists显然是空的,因为没有生命周期方法被触发。为了从'Fragment'访问数据,你应该使用'FragmentManager'来获取片段,然后调用相应的方法。见例如[这个问题](http://stackoverflow.com/questions/10903077/calling-a-fragment-method-from-a-parent-activity) – reVerse

回答

0

您的ArrayList被初始化,但没有添加任何东西。

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

这是嵌套在onCreateView,导致它只能被调用一次。您可能需要考虑将onTOuchListener添加到活动中,并将代码添加到侦听器中,以便在触摸屏幕时进行更新。

在线程中添加也可能工作,但它实际上取决于您的代码。

0

Tab3Tracks将由机器人被称为如果片段将膨胀的视图的onCreateView,所以你的阵列是空的,因为此代码

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

不随时调用