gpt4 book ai didi

java - 保存数组列表的最佳方法

转载 作者:行者123 更新时间:2023-12-01 22:18:51 25 4
gpt4 key购买 nike

这个问题以前已经回答过,但解决方案似乎对我不起作用。我想知道保存 ArrayList 的最佳方法是什么。

我生成了一个 ArrayList,其中包含手机上所有已安装的应用程序。此列表显示在 ListView 中,用户可以在其中(取消)选择应用程序。这一切工作正常。我想要的是,当用户按下保存按钮或 Activity 调用 onPause() 时,Arraylist 就会被保存。

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

这是我的代码:

创建时

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

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

加载应用程序

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:已检查(允许)的应用程序列表,用于其他 Activity

最佳答案

如果您需要在 Activity 暂停时保存列表,有多种方法可以实现。首先,您需要在 Activity 中定义私有(private)列表字段。

private ArrayList<AppDetail> allowedApps;

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

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

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

我会将Drawable icon字段更改为int icon

在您的 loadApps() 方法中更改设置 app.icon = ri.activityInfo.getIconResource();

在 loadListView 方法中更改设置 appIcon.setImageResource(apps.get(position).icon);

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

在onCreate方法中获取列表

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

2)使用onRetainCustomNonConfigurationInstance

在onRetainCustomNonConfigurationInstance中返回列表

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

在onCreate方法中获取列表

Object allowedApps= getLastCustomNonConfigurationInstance();
if (allowedApps != null) {
this.allowedApps = (List<AppDetail>) allowedApps;
}else{
this.allowedApps = new ArrayList<AppDetail>();
}

关于java - 保存数组列表的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30372500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com