2013-03-04 117 views
0

我在跨活动在Application类中存储List问题时遇到问题。在活动之间共享ArrayList

在我的启动画面中,我将数据从MySQL数据库加载到List

List是一个名为Rateit的类,extends Application。我这样做是在它作为一个类变量:

public static List<String> masterCats; 

在Splash Screen活动/类,我这样做:

onCreate

Rateit.masterCats = new ArrayList<String>(); 

里面我的AsyncTask的环中加载数据我这样做:

Rateit.masterCats.add(cat); 

cat是列表项目tha t来自数据库。我有Log.d的数据(cat)以及ListPosition来检查它是否被添加到List它是。

但是,我需要在接下来的Activity中抓取相同的信息并将其放入adapter。它返回0长度。

我只是这样做:adapter = new MasterCatAdapter(getActivity(), Rateit.masterCats, tf);

为什么列表不保持整个活动比较数据?这是因为它的static?别的东西?

(注:这里我将很快添加getter和setter方法!)

+3

不要惹访问此列表静态变量。持久存储。如果您的ArrayList很小,即使通过意图传递也是可行的。 – 2013-03-04 21:47:13

+0

我希望你不要指SQLite?或者是SharedPreferences更好的选择? – KickingLettuce 2013-03-04 21:48:09

+2

根据这篇文档,当使用静态变量时,Android的行为本身是正确的:http://developer.android.com/guide/faq/framework.html 难道是在别的地方清除静态变量吗? – 2013-03-04 22:04:47

回答

2

正如@ A - 下,在他的评论中提到的,避免你现在用静态变量有模式。相反,我会做这样的事情:

​​

然后,在你的新ActivityonCreate()或其它地方,只是在做访问列表:

getIntent().getStringArrayListExtra("MasterCats"); 

@KickingLettuce在有关的评论中也提到如果用户导航离开Activity,则保持这种可访问性。所以,无论Activity要保存ArrayList中,只需将其转换为一个逗号分隔的字符串,并将其保存在SharedPreferences像这样:

private void saveCats(){ 
    //get your ArrayList from wherever (either as a global variable or pass it into the 
    //method. 
    StringBuilder sb = new StringBuilder(); 
    for(int i = 0; i < masterCats.size(); i++){ 
     if(i == masterCats.size() - 1) 
      sb.append(masterCats.get(i)); 
     else 
      sb.append(masterCats.get(i)+","); 
    } 

    SharedPreferences.Editor prefsEditor = 
     PreferenceManager.getDefaultSharedPreferences(this).edit(); 
    prefsEditor.putString("MasterCats", sb.toString()).commit(); 

    //Note: in API 11 and beyond you can store a Set of Strings in SharedPreferences, so 
    //if you are only targeting API 11+ you could do: 
    Set<String> masterCatsSet = new LinkedHashSet<String>(); //<--using LinkedHashSet to preserve order 
    masterCatsSet.addAll(masterCats); 
    prefsEditor.putStringSet("MasterCats",masterCatsSet).commit(); 
} 

,如果你想坚持那么访问该SharedPreference在onCreate什么整个Activity生命周期的列表。

+0

我喜欢这个,但我需要保持这个信息,而应用程序是活动的(如果用户回来这个活动)。我不相信这是吗? – KickingLettuce 2013-03-04 23:27:28

+1

如果您将其作为全局变量存储在活动中,假定活动未被销毁,它仍然可以访问。如果活动确实被销毁,那么也有一些持久存储选项。我将更新我将如何处理它以贯穿整个活动生命周期。 – dennisdrew 2013-03-05 14:01:10

+1

我试过了我的方式并失败了。我明白为什么使用静态变量是一团糟。完全不可靠。我已经看到你的方法是正确的,并将标记为正确,因为很明显这是最好的方法。 – KickingLettuce 2013-03-10 02:00:21

1

保存在一个应用程序扩展分类列表是不错的主意,你可以通过以下

项目申报表像

public static List<String> masterCats; 

在App类遵循实现这一目标,并宣布了上述变量的setter和getter方法

public List getMasterCatsList() 
{ 
    return masteCats; 
} 

public Void setMasterCatsList(List list) 
{ 
    masteCats=list; 
} 

得到应用对象为您的装载机类遵循如下

应用程序应用程序=(扩展应用程序类的YOurClassName)getApplication();

,并设置列表如下

application.setMasterCatsList(List list); 

现在你可以从任何活动如下

Application application = (YOurClassName That Extends Application class) getApplication(); 

List l = application.getMasterCatsList(); 

希望这将有助于你