Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

RecyclerView एडॉप्टर डेटा कैसे अपडेट करें?

RecyclerView एडॉप्टर डेटा अपडेट करना - सही तरीका

RecyclerView एडॉप्टर को कुशलतापूर्वक अपडेट करने के लिए दानेदार notifyItem… विधियों या ListAdapter + DiffUtil का उपयोग करें। notifyDataSetChanged() से बचें—यह एनिमेशन को अक्षम करता है और पूरी सूची को रीबाइंड करता है।

सेटअप (निर्भरताएं)

dependencies {
    implementation "androidx.recyclerview:recyclerview:1.3.2"
}

दृष्टिकोण 1 - ListAdapter + DiffUtil (अनुशंसित)

public class UserAdapter extends ListAdapter {

    public UserAdapter() {
        super(DIFF_CALLBACK);
    }

    private static final DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback() {
        @Override public boolean areItemsTheSame(@NonNull User old, @NonNull User nw) {
            return old.id == nw.id;
        }
        @Override public boolean areContentsTheSame(@NonNull User old, @NonNull User nw) {
            return old.name.equals(nw.name) && old.email.equals(nw.email);
        }
    };

    @NonNull @Override
    public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_user, parent, false);
        return new VH(v);
    }

    @Override
    public void onBindViewHolder(@NonNull VH holder, int position) {
        holder.bind(getItem(position));
    }

    static class VH extends RecyclerView.ViewHolder {
        TextView name, email;
        VH(View v) { super(v); name = v.findViewById(R.id.tvName); email = v.findViewById(R.id.tvEmail); }
        void bind(User u) { name.setText(u.name); email.setText(u.email); }
    }
}

गतिविधि में उपयोग

UserAdapter adapter = new UserAdapter();
recyclerView.setAdapter(adapter);

// बाद में, नई सूची के साथ (उदाहरण: नेटवर्क प्रतिक्रिया से)
adapter.submitList(newList); // DiffUtil स्वचालित रूप से न्यूनतम अपडिट्स की गणना करता है

दृष्टिकोण 2 - मैन्युअल दानेदार सूचनाएं (यदि ListAdapter का उपयोग नहीं कर रहे हैं)

public class SimpleAdapter extends RecyclerView.Adapter {
    private final List data = new ArrayList<>();

    // जोड़ें
    public void addItem(String item) {
        data.add(item);
        notifyItemInserted(data.size() - 1);
    }

    // हटाएं
    public void removeItem(int position) {
        data.remove(position);
        notifyItemRemoved(position);
    }

    // अपडेट करें
    public void updateItem(int position, String newValue) {
        data.set(position, newValue);
        notifyItemChanged(position);
    }

    // बल्क रिप्लेस
    public void setData(List newData) {
        data.clear();
        data.addAll(newData);
        notifyDataSetChanged(); // बल्क रिप्लेस के लिए ठीक है
    }
    // ... VH, onCreate, onBind, getItemCount मानक
}

तुलना

विधिपक्षविपक्ष
ListAdapter + DiffUtilस्वचालित एनिमेशन, थ्रेड-सेफ, कम बॉयलरप्लेटमॉडल में स्थिर ID की आवश्यकता
मैन्युअल notifyItem*पूर्ण नियंत्रण, सरल मॉडलत्रुटि-प्रवण, मैन्युअल इंडेक्स गणित
notifyDataSetChanged()सरलकोई एनिमेशन नहीं, पूरी सूची रीबाइंड, जैंक

सामान्य गलतियां

  • नई सूची ऑब्जेक्ट बनाना लेकिन एडॉप्टर को सूचित नहीं करना — हमेशा submitList() या notify… कॉल करें।
  • पृष्ठभूमि थ्रेड पर सूची को संशोधित करना — UI थ्रेड पर करें या submitList() का उपयोग करें (आंतरिक रूप से पृष्ठभूमि डिफ की गणना करता है)।
  • पेलोड के साथ notifyItemChanged(pos) का उपयोग न करना — आंशिक अपडेट के लिए notifyItemChanged(pos, payload) पास करें।

परीक्षण युक्तियाँ

  1. recyclerView.setItemAnimator(null) के साथ एनिमेशन अक्षम करें ताकि लॉजिक सत्यापित हो सके।
  2. LayoutInspector का उपयोग करके पुष्टि करें कि केवल बदले हुए व्यू रीबाइंड होते हैं।
  3. बड़े डेटासेट (10k+) के साथ परीक्षण करें — DiffUtil बैकग्राउंड थ्रेड पर चलता है।

मूल उदाहरण की समीक्षा

मूल कोड notifyDataSetChanged() का उपयोग करता था एकल आइटम जोड़ के बाद—यह काम करता है लेकिन एनिमेशन खो देता है और O(n) रीबाइंड करता है। ऊपर दिए गए पैटर्न आधुनिक, एनिमेटेड और स्केलेबल हैं।

  1. Android TextView में टेक्स्ट को जस्टिफाई कैसे करें? Android TextView में टेक्स्ट को जस्टिफाई कैसे करें?

    यह उदाहरण दर्शाता है कि Android में TextView में टेक्स्ट को जस्टिफाई (दोनों किनारों पर अलाइन) कैसे किया जाता है। समस्या Android का स्टैंडर्ड TextView android:gravity=center_horizontal या left|right से जस्टिफिकेशन सपोर्ट नहीं करता। API 26 (Android 8.0) से android:justificationMode=inter_word उपलब्ध

  1. एंड्रॉइड पर अपने ऐप्स कैसे अपडेट करें एंड्रॉइड पर अपने ऐप्स कैसे अपडेट करें

    आपके एंड्रॉइड पर ऐप्स को ऐप्स के डेवलपर्स द्वारा नियमित रूप से अपडेट प्राप्त होते हैं ताकि उनकी कार्यक्षमता में सुधार किया जा सके। वे अक्सर स्थिरता और प्रदर्शन सुधार के साथ-साथ सुरक्षा अपडेट भी लाते हैं। डिफ़ॉल्ट रूप से, एंड्रॉइड ऐप्स खुद को ऑटोमैटिकली अपडेट कर लेते हैं, लेकिन कई उपयोगकर्ता नहीं जान

  1. Android Data Binding मास्टर करें: सहज UI डेटा एकीकरण Android Data Binding मास्टर करें: सहज UI डेटा एकीकरण

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