2015-05-21 4 views
0

Этот вопрос был дан раньше, но решения, похоже, не работают для меня. Я хотел бы знать, что лучший способ сохранить ArrayList.Лучший способ сохранить arraylist

Я создаю ArrayList со всеми установленными приложениями на телефоне. Этот список показан в ListView, где пользователь может (de) выбирать приложения. Все это прекрасно работает. Я бы хотел, чтобы Arraylist сохранялся, когда пользователь нажимает кнопку сохранения или когда действие вызывает onPause().

Когда пользователь вернется к списку, пользователь увидит список, как он сохранил/оставил его.

Вот мой код:

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: список проверено (разрешено) приложений, используемых в другом виде деятельности

+0

AFAIK, вам нужно найти способ, чтобы сохранить его в файл на внутреннюю память и заселить его оттуда. – Bhoot

+1

Вы говорите, что вы исследовали решения, и они не работают для вас, пожалуйста, объясните, что именно вы пробовали, и почему именно это не устраивало ваш прецедент. – Egor

+1

Сериализовать список ... –

ответ

1

Если вам нужно сохранить свой список, когда действие приостановлено, у вас есть несколько способов сделать это. Сначала вам нужно определить поле частного списка в своей деятельности.

private ArrayList<AppDetail> allowedApps; 

1) Сделать AppDetail сериализации и использовать onSaveInstanceState

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

---------------- EDIT -------- ---------

Я бы поменял Drawable icon поле для int icon.

В ваших loadApps() метод изменения setence app.icon = ri.activityInfo.getIconResource();

В YOUT методе loadListView изменения setence 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>(); 
} 
+0

Спасибо за ваш быстрый ответ! Я применил первый метод. Когда я поворачиваю экран, он будет вызывать onSaveInstanceState. Когда я регистрирую значение! = Null в onCreate, он правильно регистрирует список. Когда я нажимаю кнопку «Отдыха» (активные приложения), приложение выходит из строя. «Канал невосстановимо сломан и будет удален!» – DevelopingBeaver

+0

выслушать слушателя с помощью кнопки. – juanhl

+0

На данный момент я использую метод onClick. Где я определяю onClick в XML-файле! Или вы имели в виду слушателя кнопки повторов? – DevelopingBeaver

1

Я думаю, что вы ищете что-то вроде "Parcelable". Он может сохранять любой ArrayList и возвращать его обратно, когда вам это нужно, как и Shared Preferences.

Пожалуйста, смотрите здесь,

How to save custom ArrayList on Android screen rotate?

1

ArrayList сериализуем. Сохраните его как сериализуемый объект в файле на складе

Смежные вопросы