2010-04-27 25 views
10

संभव डुप्लिकेट:
Maintain/Save/Restore scroll position when returning to a ListViewकैसे ListView की स्थिति बनाए रखने के

मैं अपने गतिविधि में मेरी ListView का स्थान कैसे बनाए रख सकते हैं जब मैं (किसी अन्य गतिविधि के लिए जाने के लिए एक और शुरू करके इरादा) और फिर वापस आओ (बैक बटन दबाएं)?

धन्यवाद।

उत्तर

1
@Override 
protected void onPause() 
{ 
    // Save scroll position 
    SharedPreferences preferences = context.getSharedPreferences("SCROLL", 0); 
    SharedPreferences.Editor editor = preferences.edit(); 
    int scroll = mListView.getScrollY(); 
    editor.put("ScrollValue", scroll); 
    editor.commit(); 
} 

@Override 
protected void onResume() 
{ 
    // Get the scroll position 
    SharedPreferences preferences = context.getSharedPreferences("SCROLL", 0); 
    int scroll = preferences.getInt("ScrollView", 0); 
    mListView.scrollTo(0, scroll); 
} 
+0

अगर मैं 'getSharedPreferences' का उपयोग करें, इसका मतलब यह है कि यह डिस्क पर बने रहेंगे? यानी मैं फोन को रीबूट करने के बाद मूल्य को संरक्षित रखूंगा? अगर मुझे वह नहीं चाहिए तो क्या होगा? जब मैं फोन रीबूट करता हूं, तो यह 0 से शुरू होगा? – michael

+0

यह शटडाउन से परे बनी रहेगी। यदि आप इसे नहीं चाहते हैं तो आप एक सदस्य चर के लिए मान लिख सकते हैं और आशा करते हैं कि यह बनी रहेगी। अगर ऐप को कचरा इकट्ठा नहीं किया जाना चाहिए। आपको बस यह तय करने की आवश्यकता है कि आप किस पक्ष को गलती करना चाहते हैं। – CaseyB

+1

मुझे लगता है कि ऑन लाइन में लाइन 6 को editor.putInt ("स्क्रॉलवैल्यू", स्क्रॉल) पढ़ना चाहिए; – Das

2

आप onSaveInstanceState का उपयोग स्क्रॉल स्थिति की दुकान और फिर या तो onCreate या onRestoreInstanceState यह बहाल करने के लिए उपयोग करने के लिए करना चाहिए।

http://developer.android.com...#onSaveInstanceState ...

+0

मैंने आपके रास्ते की कोशिश की। mListView.getSelectedItemPosition(); मुझे एक -1 और mListView वापस करो।getScrollY() मुझे 0 दें। जब मैं अपना परीक्षण करता हूं तो मैं स्पष्ट रूप से अपनी सूची दृश्य में स्क्रॉल कर रहा हूं। कोई विचार क्यों यह काम नहीं कर रहा है? – michael

+0

मेरे रास्ते की कोशिश करने के लिए आपने क्या किया? – clahey

+0

मैंने किया: सुरक्षित इंस्टॉलेशनस्टेट (बंडल आउटस्टेट) पर सुरक्षित शून्य { super.onSaveInstanceState (आउटस्टेट); int scroll = mListView.getScrollY(); System.out.println ("स्क्रॉलवाई" + स्क्रॉल); } – michael

27

घोषित वैश्विक चर:

int index = 0; 
ListView list; 

और अपने onCreate() में ListView का संदर्भ लें:

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

इसके बाद, onResume() में, पर इस लाइन को जोड़ने अंत:

list.setSelectionFromTop(index, 0); 

अन्त में, में, अंत में निम्नलिखित पंक्ति जोड़ें:

index = list.getFirstVisiblePosition(); 
+0

को नष्ट करने के बाद इसे जारी रखना चाहते हैं, इसके अलावा, मैं इंडेक्स को एक साझा प्रैक्टिस ऑब्जेक्ट में सहेजता हूं ताकि जब एप्लिकेशन स्कोप से बाहर हो जाए, तब भी यह सूचकांक – mray190

+1

@ mray190 को बरकरार रखेगा उदाहरण राज्य की बचत क्या है। आप इस मान को अभिविन्यास परिवर्तनों पर एक बंडल में सहेज सकते हैं, फिर गतिविधि या फ्रैगमेंट स्तर पर दृश्य को पुनर्निर्मित करते समय स्क्रॉल किए गए राज्य को पुनर्स्थापित कर सकते हैं। – Phil

2

कृपया ध्यान दें कि ListView.getScrollY() का उपयोग कर पुस्तक स्थिति बहाल करने के लिए अच्छी तरह से काम नहीं करता है।

Android: ListView.getScrollY() - does it work?

यह पूरे देखने के लिए स्क्रॉल राशि के लिए बात कर रहा है देखें, तो यह लगभग हमेशा 0.

यह भी समय की सबसे यह मान है कि मुझे क्या हुआ होगा 0. ListView.getFirstVisiblePosition() ListView.setSelection() के साथ अधिक विश्वसनीय रूप से काम करता है।

7

सरल करो ....

@Override 
protected void onPause() 
{ 
    index = listView.getFirstVisiblePosition(); 
    // store index using shared preferences 
} 

और ..

@Override 
public void onResume() { 
super.onResume(); 
// get index from shared preferences 

if(listView != null){ 
    if(listView.getCount() > index) 
     listView.setSelectionFromTop(index, 0); 
    else 
     listView.setSelectionFromTop(0, 0); 
} 
+1

कोड की एक व्याख्या ने मदद की हो सकती है। –

संबंधित मुद्दे