RecyclerView की स्थिति मैनेज करना

RecyclerView कम से कम ग्राफ़िक रिसॉर्स का इस्तेमाल करके, ज़्यादा डेटा दिखा सकता है. जब उपयोगकर्ता RecyclerView में मौजूद आइटम को स्क्रोल करते हैं, तो View स्क्रीन से बाहर स्क्रोल किए गए आइटम के इंस्टेंस का फिर से इस्तेमाल किया जाता है. ऐसा, स्क्रीन पर स्क्रोल किए जाने पर नए आइटम बनाने के लिए किया जाता है. हालांकि, कॉन्फ़िगरेशन में हुए बदलाव, जैसे कि डिवाइस के रोटेशन से, RecyclerView की स्थिति रीसेट हो सकती है. इससे, उपयोगकर्ताओं को आइटम की सूची में अपनी पिछली जगह पर फिर से स्क्रोल करना पड़ता है.

कॉन्फ़िगरेशन में होने वाले सभी बदलावों के दौरान, RecyclerView की स्थिति, खास तौर पर स्क्रोल की स्थिति और सूची के एलिमेंट की स्थिति में कोई बदलाव नहीं होना चाहिए.

स्थिति बनाए रखना

RecyclerView स्क्रोल पोज़िशन को सेव करने के लिए, RecyclerView.Adapter की स्थिति को पहले जैसा करने की नीति सेट करें. RecyclerView सूची के आइटम की स्थिति सेव करें. RecyclerView अडैप्टर में, सूची के आइटम की स्थिति जोड़ें. साथ ही, जब सूची के आइटम किसी ViewHolder से बंधे हों, तब उनकी स्थिति को वापस लाएं.

1. Adapter की स्थिति को पहले जैसा करने की नीति चालू करना

RecyclerView अडैप्टर की स्थिति को पहले जैसा करने की नीति चालू करें, ताकि कॉन्फ़िगरेशन में होने वाले बदलावों के बावजूद, RecyclerView की स्क्रोलिंग पोज़िशन बनी रहे. अडैप्टर कन्स्ट्रक्टर में नीति से जुड़ी खास जानकारी जोड़ें:

Kotlin

class MyAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    init {
        stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY
    }
    ...
}

Java

class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    public Adapter() {
        setStateRestorationPolicy(StateRestorationPolicy.PREVENT_WHEN_EMPTY);
    }
    ...
}

2. स्टेटफ़ुल सूची के आइटम की स्थिति सेव करना

जटिल RecyclerView सूची के आइटम की स्थिति सेव करें. जैसे, ऐसे आइटम जिनमें EditText एलिमेंट शामिल हैं. उदाहरण के लिए, EditText की स्थिति सेव करने के लिए, टेक्स्ट में हुए बदलावों को कैप्चर करने के लिए, onClick हैंडलर जैसा कॉलबैक जोड़ें. कॉलबैक में, यह तय करें कि कौनसा डेटा सेव करना है:

Kotlin

input.addTextChangedListener(
    afterTextChanged = { text ->
        text?.let {
            // Save state here.
        }
    }
)

Java

input.addTextChangedListener(new TextWatcher() {

    ...

    @Override
    public void afterTextChanged(Editable s) {
        // Save state here.
    }
});

अपने Activity या Fragment में कॉलबैक की जानकारी दें. स्टेटस सेव करने के लिए, ViewModel का इस्तेमाल करें.

3. Adapter में सूची के आइटम की स्थिति जोड़ें

RecyclerView.Adapter में, सूची के आइटम की स्थिति जोड़ें. होस्ट Activity या Fragment बनने पर, आइटम की स्थिति को अडैप्टर कन्स्ट्रक्टर को पास करें:

Kotlin

val adapter = MyAdapter(items, viewModel.retrieveState())

Java

MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());

4. अडैप्टर के ViewHolder में, सूची के आइटम की स्थिति वापस लाना

RecyclerView.Adapter में, किसी आइटम से ViewHolder को बांधने पर, आइटम की स्थिति को पहले जैसा करें:

Kotlin

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    ...
    val item = items[position]
    val state = states.firstOrNull { it.item == item }

    if (state != null) {
        holder.restore(state)
    }
}

Java

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    ...
    Item item = items[position];
    Arrays.stream(states).filter(state -> state.item == item)
        .findFirst()
        .ifPresent(state -> holder.restore(state));
}

प्रमुख बिंदु

  • RecyclerView.Adapter#setStateRestorationPolicy(): इससे पता चलता है कि कॉन्फ़िगरेशन में बदलाव होने के बाद, RecyclerView.Adapter अपनी स्थिति को कैसे वापस लाता है.
  • ViewModel: किसी गतिविधि या फ़्रैगमेंट की स्थिति को सेव करता है.

नतीजे

अब आपके RecyclerView में, स्क्रोल की स्थिति और RecyclerView की सूची में मौजूद हर आइटम की स्थिति को वापस लाया जा सकता है.

ऐसे संग्रह जिनमें यह गाइड शामिल है

यह गाइड, चुने गए क्विक गाइड के कलेक्शन का हिस्सा है. इसमें Android डेवलपमेंट के बड़े लक्ष्यों के बारे में बताया गया है:

अपने ऐप्लिकेशन को टैबलेट, फ़ोल्ड किए जा सकने वाले डिवाइसों, और ChromeOS डिवाइसों पर ऑप्टिमाइज़ किया गया उपयोगकर्ता अनुभव देने के लिए चालू करें.

क्या आपका कोई सवाल है या सुझाव/राय देनी है

अक्सर पूछे जाने वाले सवालों के पेज पर जाएं और क्विक गाइड के बारे में जानें. इसके अलावा, हमसे संपर्क करके अपने सुझाव/राय दें.