保存arraylist的最佳方式

时间:2015-05-21 11:31:52

标签: java android arraylist sharedpreferences android-adapter

此问题之前已经得到解答,但解决方案似乎对我不起作用。我想知道保存ArrayList的最佳方法是什么。

我生成一个包含手机上所有已安装应用程序的ArrayList。此列表显示在ListView中,用户可以(de)选择应用程序。这一切都很好。我想要的是当用户按下保存按钮或活动调用onPause()时,Arraylist会被保存。

当用户返回列表时,用户将按照保存/离开的方式查看列表。

这是我的代码:

onCreate

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_app_list);

    loadApps();
    loadListView();
    addClickListener();
}

loadApps

private void loadApps(){
    manager = getPackageManager();
    apps = new ArrayList<AppDetail>();

    if(apps.size()==0) {
        Intent i = new Intent(Intent.ACTION_MAIN, null);
        i.addCategory(Intent.CATEGORY_LAUNCHER);
        List<ResolveInfo> availableActivities = manager.queryIntentActivities(i, 0);
        for (ResolveInfo ri : availableActivities) {
            AppDetail app = new AppDetail();
            app.label = ri.loadLabel(manager);
            app.name = ri.activityInfo.packageName;
            app.icon = ri.activityInfo.loadIcon(manager);
            app.allowed = false;
            apps.add(app);
        }
        Log.i("applist", apps.toString());
    }
}

AppDetail.class

public class AppDetail {
CharSequence label;
CharSequence name;
Drawable icon;
Boolean allowed;

loadListView

private void loadListView(){

    list = (ListView)findViewById(R.id.apps_list);

    adapter = new ArrayAdapter<AppDetail>(this, R.layout.list_item, apps) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if(convertView == null){
                convertView = getLayoutInflater().inflate(R.layout.list_item, null);
            }

            ImageView appIcon = (ImageView)convertView.findViewById(R.id.item_app_icon);
            appIcon.setImageDrawable(apps.get(position).icon);

            TextView appLabel = (TextView)convertView.findViewById(R.id.item_app_label);
            appLabel.setText(apps.get(position).label);

            TextView appName = (TextView)convertView.findViewById(R.id.item_app_name);
            appName.setText(apps.get(position).name);

            if(list.isItemChecked(position)){convertView.setBackgroundColor(getResources().getColor(R.color.green));}
            if(!list.isItemChecked(position)){convertView.setBackgroundColor(getResources().getColor(R.color.white));}
            return convertView;
        }
    };
    list.setAdapter(adapter);
    list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}

addClickListener

private void addClickListener() {
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> av, View v, int pos,
                                long id) {
            checked = list.getCheckedItemPositions();
            ArrayList<AppDetail> allowedApps = new ArrayList<>();

            for (int i = 0; i < checked.size(); i++) {
                // Item position in adapter
                int position = checked.keyAt(i);
                // Add sport if it is checked i.e.) == TRUE!
                if (checked.valueAt(i)) {
                    allowedApps.add(adapter.getItem(position));
                }
            }
            adapter.notifyDataSetChanged();
            Log.i("", allowedApps.toString());
        }
    });
}

此时我正在创建两个列表: 列表:所有应用的列表 AllowedApps:要在其他活动中使用的已检查(允许)应用的列表

3 个答案:

答案 0 :(得分:1)

我认为你正在寻找像“Parcelable”这样的东西。它可以保存任何ArrayList,并在需要时检索回来,就像共享首选项一样。

请看这里,

How to save custom ArrayList on Android screen rotate?

答案 1 :(得分:1)

ArrayList是可序列化的。将其保存为存储文件中的可序列化对象

答案 2 :(得分:1)

如果您需要在暂停活动时保存列表,则可以通过多种方式执行此操作。首先,您需要在活动中定义私人列表字段。

private ArrayList<AppDetail> allowedApps;

1)使AppDetail可序列化并使用onSaveInstanceState

public class AppDetail implements Serializable {
    CharSequence label;
    CharSequence name;
    Drawable icon;
    Boolean allowed;
}

----------------编辑-----------------

我会更改Drawable icon的{​​{1}}字段。

在loadApps()方法中,更改句子int icon

在你的loadListView方法中改变句子app.icon = ri.activityInfo.getIconResource();

appIcon.setImageResource(apps.get(position).icon);

在onCreate方法中检索列表

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable("allowedApps", allowedApps);
}

2)使用onRetainCustomNonConfigurationInstance

返回onRetainCustomNonConfigurationInstance

中的列表
if (savedInstanceState != null) {
     allowedApps = (List<AppDetail>)savedInstanceState.getSerializable("allowedApps");
}else{
     allowedApps = new ArrayList<AppDetail>();
}

在onCreate方法中检索列表

@Override
public Object onRetainCustomNonConfigurationInstance() {
    return allowedApps;
}