प्रोग्रामेटिक रूप से recyclerview में एक नया आइटम जोड़ें?


115

मैं अभी भी recyclerview के आसपास अपना सिर पाने की कोशिश कर रहा हूं। मेरे पास एक सरणी सूची है, जिसका उपयोग मैं एक पुनर्नवीनीकरण दृश्य को आरंभ करने के लिए करता हूं।

मैं एडेप्टर व्यू पोस्ट को एडॉप्टर और लेआउटमैनगर सेट करते हुए नए आइटम कैसे जोड़ सकता हूं?

private void initData() {
        mItems = new ArrayList<String>();
        for (int i = 0; i < ITEMS_COUNT; i++) {
            mItems.add("Item " + (i + 1));
        }
    }

    private void initRecyclerView() {
        mRecentRecyclerView = (RecyclerView) findViewById(R.id.recentrecyclerView);
        mRecentRecyclerView.setHasFixedSize(true);
        mRecentLayoutManager = new LinearLayoutManager(this);
        mRecentRecyclerView.setLayoutManager(mRecentLayoutManager);



        mAdapter = new RecyclerView.Adapter<CustomViewHolder>() {
            @Override
            public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.notice_snippet
                        , viewGroup, false);
                return new CustomViewHolder(view);
            }

            @Override
            public void onBindViewHolder(CustomViewHolder viewHolder, int i) {
                viewHolder.noticeSubject.setText(mItems.get(i));
            }

            @Override
            public int getItemCount() {
                return mItems.size();
            }

        };
        mRecentRecyclerView.setAdapter(mAdapter);

    private class CustomViewHolder extends RecyclerView.ViewHolder {

        private TextView noticeSubject;

        public CustomViewHolder(View itemView) {
            super(itemView);

            noticeSubject = (TextView) itemView.findViewById(R.id.notice_subject);
        }
    }

तो मूल रूप से मैं initdata()और के बाद initRecyclerView(), मैं RecyclerView में एक नया आइटम कैसे जोड़ूँ ??


आप इस उदाहरण को जीथब हैप्पी कोड में देख सकते हैं !!!
काबिजस

जवाबों:


272

पहले अपने आइटम को इसमें जोड़ें mItemsऔर फिर उपयोग करें:

mAdapter.notifyItemInserted(mItems.size() - 1);

इस विधि का उपयोग करने से बेहतर है:

mAdapter.notifyDataSetChanged();

प्रदर्शन में।


11
अच्छा उत्तर। इसका यह भी अर्थ है कि यह एनिमेशन को नहीं तोड़ देगा
बेन पियर्सन

7
इसे सही उत्तर के रूप में स्वीकार किया जाना चाहिए, अन्य एक एनिमेशन को तोड़ता है और इस से कम कुशल है।
मैसिमो

27
मैं वह हूं, जिसने स्वीकृत उत्तर दिया और मुझे लगता है कि यह स्वीकार किया जाना चाहिए: D
अब्देलरहमान एल्कडी

2
@AJW हाँ। mItems के अंतिम तत्व का सूचकांक mItems.size () - 1 है।
मुस्तफा

2
धन्यवाद! मेरे पास ऐसी छवियां हैं जिन्हें इंटरनेट से ऑनडाउन किया जाना चाहिए। जब भी मुझे डेटा प्राप्त होता है, मुझे सूची में संलग्न करना होता है और सूचनाडॉटसेटचैंग्ड () कहा जाता है। लेकिन इसने एक छवि को चंचल बना दिया। ऊपर सही समाधान था जिसे मैं खोज रहा था। आप mAdapter.notifyItemRangeInserted (mItems.size () - 1, new_array_of_items_to_be_added.size ()) का भी उपयोग कर सकते हैं;
विग्नेश बाला

38

बस अपने डेटा संरचना (mItems) में जोड़ें, और फिर डेटासेट परिवर्तन के बारे में अपने एडाप्टर को सूचित करें

private void addItem(String item) {
  mItems.add(item);
  mAdapter.notifyDataSetChanged();
}

addItem("New Item");

2
क्या होगा यदि यह एक स्ट्रिंग नहीं है जिसे मैं जोड़ना चाहता हूं, लेकिन एक व्यूग्रुप?
इगोरगानापोलस्की

1
@IgorGanapolsky मुझे भी यही संदेह है। क्या आपको इसके लिए कोई समाधान मिला?
शाश_केपी

यहाँ भी संदेह है! कोई मदद?
सुरजन बरई

5
@IgorGanapolsky आइटम प्रकार आपके एडाप्टर द्वारा निर्दिष्ट किया जाएगा, इसलिए यह वास्तव में कोई भी वस्तु हो सकती है। लेकिन ध्यान रखें कि आपके द्वारा जोड़े जाने वाले आइटम को केवल डेटा माना जाता है। RecyclerView ने व्यू बढ़ाने और बांधने के लिए फ़ंक्शंस में बनाया है, जो तब होता है जब आप अधिसूचित किए जाते हैं। संपादित किए जा रहे दृश्य को देखने के लिए आप onBindViewHolder डीबग कर सकते हैं।
क्रिस

1
@IgorGanapolsky आपका ArrayList<T>वस्तु के प्रकार आप जोड़ना चाहते हैं, उदाहरण के लिए उपयोग करना होगा ArrayList<ViewGroup>बजाय ArrayList<String>। तो फिर तुम बस से तर्क प्रकार बदल सकते हैं Stringकरने के लिए ViewGroup। (नेक्रो के लिए क्षमा करें)।
एरिक रीड ने

14

यदि आप इस सूची का उपयोग करने के लिए कई आइटम जोड़ रहे हैं:

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

यह किसी भी पंजीकृत पर्यवेक्षकों को सूचित करता है कि वर्तमान में परिलक्षित आइटम चालू स्थिति में शुरू होने वाले आइटम हाल में डाले गए हैं। आइटम पहले स्थित स्थिति में और इसके बाद स्थिति पॉज़िटिनस्टार्ट + आइटमकाउंट पर शुरू हो सकता है

डेटासेट में मौजूदा आइटम अभी भी माना जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.