有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在活动之间共享ArrayList

我在跨活动的Application类中存储List时遇到问题

在我的启动屏幕中,我正在从MySQL数据库将数据加载到List

List位于一个名为Rateit的类中,该类extends Application。我将其作为类变量执行:

public static List<String> masterCats;

在启动屏幕活动/课程中,我执行以下操作:

在{}中:

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

在加载数据的AsyncTask循环中,我执行以下操作:

Rateit.masterCats.add(cat);

cat是来自数据库的列表项。我有Log.d数据(cat)和ListPosition来检查它是否被添加到List中,并且它是

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

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

为什么列表不能跨活动维护数据?这是因为它的static吗?还有别的吗

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


共 (2) 个答案

  1. # 1 楼答案

    正如@acc在他的评论中提到的,避免使用静态变量的模型。相反,我会这样做:

    private void yourMethodWhereYouGetYourData(){
        //get your data
        ArrayList<String> masterCats = new ArrayList<String>();
        masterCats.add(cat);
    
       //Assuming you're doing this synchronously, once you've gotten your data just do:
       Intent i = new Intent(this, YourActivity.class);
       i.putStringArrayListExtra("MasterCats", masterCats);
       startActivity(i);
    }
    

    然后,在新的ActivityonCreate()或任何地方,只需执行以下操作即可访问列表:

    getIntent().getStringArrayListExtra("MasterCats");
    

    @kicking莴苣在评论中也提到,如果用户离开Activity,则可以访问该文件。因此,在任何一个Activity中,只要将其转换为逗号分隔的字符串并保存在SharedReferences中,如下所示:

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

    然后,如果希望在整个Activity生命周期中持久化列表,请在onCreate或其他内容中访问此SharedReference

  2. # 2 楼答案

    将列表保存在应用程序扩展类中是个好主意,您可以通过以下方法实现它

    在应用程序类中声明如下列表,如

    public static List<String> masterCats;
    

    并为上述变量声明setter和getter方法

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

    在装入器类中获取应用程序对象,如下所示

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

    并将列表设置为如下所示

      application.setMasterCatsList(List list); 
    

    现在,您可以通过以下任何活动访问此列表

      Application application = (YOurClassName That Extends Application class) getApplication();
    
     List l = application.getMasterCatsList();
    

    希望对你有帮助