android: how do i preserve the data in my arrayadapter/listview when change orientation?

15,888

Solution 1

You can also use http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance()

Something like this in your Activity:

@Override
public Object onRetainNonConfigurationInstance() {
    return this.m_adapter.getItems();
}

And then in your onCreate():

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    // more init stuff here

    sResultsArr = (ArrayList<SearchItems>)getLastNonConfigurationInstance();
    if(sResultArr == null) {
        sResultsArray = new ArrayList<SearchItems>();  // or some other initialization
    }

    self.m_adapter = new ResultsAdapter(home.this, R.layout.listrow, sResultsArr,home.this);

    // ...
}

Solution 2

If you have data in memory that needs to stick around during an orientation change, you need to do something to arrange that. The best solution is to implement onSaveInstanceState() and use it to store your data, because that gets used not only for orientation changes, but other situations as well (e.g., your activity is on the current stack, but it needs to get kicked out of RAM to free up space for things later in the stack).

Share:
15,888
Admin
Author by

Admin

Updated on June 05, 2022

Comments

  • Admin
    Admin almost 2 years

    as above, is it done automatically? My list was empty once the orientation chMYanges? and nope, i need the orientation change =)

    My adapter

    public class ResultsAdapter extends ArrayAdapter<SearchItem> implements Filterable{
    
    private ArrayList<SearchItem> subItems;
    private ArrayList<SearchItem> allItems;// = new ArrayList<SearchItem>();
    private LayoutInflater inflater;
    private PTypeFilter filter;
    private OnCheckedChangeListener test;
    
    public ResultsAdapter(Context context, int textViewResourceId, ArrayList<SearchItem> items,OnCheckedChangeListener a) {
    
        super(context, textViewResourceId, items);
            //this.subItems = items;
            for( int i = 0;i < items.size();i++){
                subItems.add(items.get(i));
            }
            this.allItems = this.subItems;
            inflater= LayoutInflater.from(context);
    
            test = a;
    }
    

    My onCreate

        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        
    
    
    
        ListView lvr = (ListView)findViewById(R.id.search_results);
    
    
    
      //  if(savedInstanceState == null){
            this.m_adapter = new ResultsAdapter(home.this, R.layout.listrow, sResultsArr,home.this);
            this.specsAdapter = new FeaturesExpandableAdapter(home.this,new ArrayList<String>(),new ArrayList<ArrayList<Feature>>()); 
       // }
            lvr.setAdapter(this.m_adapter);
    

    thanks guys