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

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

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

नतीजे

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

वर्शन के साथ काम करने की सुविधा

यह तरीका, सभी एपीआई लेवल के साथ काम करता है.

डिपेंडेंसी

कोई नहीं.

स्टेट बनाए रखना

RecyclerView.Adapter की स्क्रोल पोज़िशन सेव करने के लिए, RecyclerView.Adapter की स्थिति वापस लाने की नीति सेट करें.RecyclerView यह कुकी, 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: यह किसी गतिविधि या फ़्रैगमेंट के लिए स्थिति को सेव करता है.

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

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

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

कोई सवाल पूछना या सुझाव/राय देना है

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