android - एंड्रॉइड स्क्रीन पर कस्टम ऐरेलिस्ट को कैसे सुरक्षित करें?




object arraylist (2)

मेरे पास कस्टम ऑब्जेक्ट्स के साथ एक ArrayList जो मैं स्क्रीन को घुमाने और सहेजने में सक्षम होना चाहता हूं।

मुझे पता है कि यह onSaveInstanceState और onRestoreInstanceState साथ किया जा सकता है अगर मैं ArrayList अपनी कक्षा बनाना चाहता था, जो या तो Parcelable या Parcelable लागू करता है ... लेकिन क्या कोई और वर्ग बनाने के बिना ऐसा करने का कोई तरीका है?


आप onRetainNonConfigurationInstance() उपयोग कर सकते हैं। यह आपको कॉन्फ़िगरेशन परिवर्तन से पहले किसी ऑब्जेक्ट को सहेजने की अनुमति देता है, और getLastNonConfigurationInstanceState () के साथ इसे पुनर्स्थापित करता है।

गतिविधि के अंदर:

    @Override
    public Object onRetainNonConfigurationInstance() {
        return myArrayList;
    }

onCreate() अंदर:

    try{
        ArrayList myArrayList = (ArrayList)getLastNonConfigurationInstance();
    } catch(NullPointerException e) {}

रनटाइम परिवर्तनों को संभालना: http://developer.android.com/guide/topics/resources/runtime-changes.html दस्तावेज़ीकरण: http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance%28%29


आपको अपनी कस्टम ऑब्जेक्ट्स के ऐरेलिस्ट को पास करने के लिए एक नई कक्षा बनाने की आवश्यकता नहीं है। आपको बस अपनी ऑब्जेक्ट के लिए पार्सेलबल क्लास को कार्यान्वित करना चाहिए और onSaveInstanceState() और onRestoreInstanceState() Bundle#putParcelableArrayList() उपयोग करना चाहिए। यह विधि पार्ससेल के एक ऐरेलिस्ट को स्वयं ही संग्रहित करेगी।

चूंकि पार्ससेलबल्स (और सीरियलज़ेबल्स और बंडल) का विषय कभी-कभी मेरे सिर को चोट पहुंचाता है, यहां एक ब्रेन में संग्रहीत कस्टम पार्सेलबल ऑब्जेक्ट्स युक्त एक ऐरेलिस्ट का मूल उदाहरण है। (यह कट और पेस्ट रननेबल है, कोई लेआउट जरूरी नहीं है।)

पार्ससेल योग्य कार्यान्वयन

public class MyObject implements Parcelable {
    String color;
    String number;

    public MyObject(String number, String color) {
        this.color = color;
        this.number = number;
    }

    private MyObject(Parcel in) {
        color = in.readString();
        number = in.readString();
    }

    public int describeContents() {
        return 0;
    }

    @Override
    public String toString() {
        return number + ": " + color;
    }

    public void writeToParcel(Parcel out, int flags) {
        out.writeString(color);
        out.writeString(number);
    }

    public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>() {
        public MyObject createFromParcel(Parcel in) {
            return new MyObject(in);
        }

        public MyObject[] newArray(int size) {
            return new MyObject[size];
        }
    };
}

राज्यों को सहेजें / पुनर्स्थापित करें

public class Example extends ListActivity {
    ArrayList<MyObject> list;

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

        if(savedInstanceState == null || !savedInstanceState.containsKey("key")) {
            String[] colors = {"black", "red", "orange", "cyan", "green", "yellow", "blue", "purple", "magenta", "white"};
            String[] numbers = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"};

            list = new ArrayList<MyObject>();
            for(int i = 0; i < numbers.length; i++) 
                list.add(new MyObject(numbers[i], colors[i]));
        }
        else {
            list = savedInstanceState.getParcelableArrayList("key");
        }

        setListAdapter(new ArrayAdapter<MyObject>(this, android.R.layout.simple_list_item_1, list));
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putParcelableArrayList("key", list);
        super.onSaveInstanceState(outState);
    }
}




screen-rotation