পুনর্ব্যবহারযোগ্য প্রোগ্রামে কোনও নতুন আইটেম যুক্ত করবেন?


113

আমি এখনও আমার মাথাটি পুনর্ব্যবহারযোগ্য ঘুরে দেখার চেষ্টা করছি। আমার একটি অ্যারেলিস্ট আছে, যা দিয়ে আমি একটি পুনর্ব্যবহারযোগ্য ভিউ আরম্ভ করার জন্য ব্যবহার করি।

অ্যাডাপ্টার এবং লেআউটম্যান ম্যানেজার সেট করে পুনর্ব্যবহারযোগ্য ভিউ পোস্টে আমি কীভাবে নতুন আইটেম যুক্ত করতে পারি?

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()কীভাবে পুনর্ব্যবহারযোগ্য ভিউতে একটি নতুন আইটেম যুক্ত করব ??


আপনি গিথুব হ্যাপি কোডে এই উদাহরণটি দেখতে পাচ্ছেন !!!
ক্যাবেজাস

উত্তর:


270

প্রথমে আপনার আইটেমটি যুক্ত করুন mItemsএবং তারপরে ব্যবহার করুন:

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

এই পদ্ধতিটি ব্যবহার করার চেয়ে ভাল:

mAdapter.notifyDataSetChanged();

কর্মক্ষমতা।


10
ভাল উত্তর. এর অর্থ হ'ল এটি অ্যানিমেশনগুলি ভাঙবে না
বেন পিয়ারসন

7
এটি সঠিক উত্তর হিসাবে গ্রহণ করা উচিত, অন্যটি অ্যানিমেশনগুলি ভেঙে দেয় এবং এটির চেয়ে কম দক্ষ।
ম্যাসিমো

26
আমি সেই যিনি গৃহীত উত্তরের উত্তর দিয়েছিলেন এবং আমি মনে করি এটি গ্রহণযোগ্য হওয়া উচিত: ডি
আবদেলরহমান এলকাদি

2
@ এজেডাব্লু হ্যাঁ মিটেমের শেষ উপাদানটির সূচক হ'ল মিটেমস.সাইজ () - 1।
মোস্তফা

2
ধন্যবাদ! আমার কাছে এমন চিত্র রয়েছে যা অনবিন্দ ভিহোল্ডারে ইন্টারনেট থেকে লোড করা উচিত। প্রতিবার আমি ডেটা গ্রহণ করি, আমাকে তালিকায় যুক্ত করতে হবে এবং notifyDataSetChanged () নামে ডাকা হবে। তবে এটি একটি চিত্রের ঝাঁকুনির প্রভাব তৈরি করেছে। উপরে সঠিক সমাধানটি আমি অনুসন্ধান করছিলাম। আপনি mAdapter.notifyItemRangeInsert (mItems.size () - 1, new_array_of_items_to_be_added.size ()) ব্যবহার করতে পারেন;
বিগনেশ বালা

37

কেবল আপনার ডেটা স্ট্রাকচার (mItems) এ যুক্ত করুন এবং তারপরে ডেটাसेट পরিবর্তন সম্পর্কে আপনার অ্যাডাপ্টারকে অবহিত করুন

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

addItem("New Item");

2
যদি এটি স্ট্রিং না করে আমি যুক্ত করতে চাই তবে ভিউগ্রুপ?
ইগোরগানাপলস্কি

1
@ ইগরগানাপলস্কি আমারও একই সন্দেহ আছে। আপনি কি এর জন্য কোনও সমাধান খুঁজে পেয়েছেন?
সাশ_কেপি

এখানেও একই সন্দেহ! কোন সাহায্য?
শ্রুজান বড়াই

5
@ আইগরগানাপলস্কি আইটেমের ধরণটি আপনার অ্যাডাপ্টারের দ্বারা নির্দিষ্ট করা হবে, সুতরাং এটি সত্যই কোনও বস্তু হতে পারে। তবে আইটেমটি মনে রাখবেন আপনার যোগটি কেবলমাত্র ডেটা হওয়ার কথা। রিসাইক্লার ভিউ একটি ভিউ স্ফীত এবং বাঁধাইয়ের জন্য ফাংশনগুলিতে তৈরি করেছে, যা আপনি যখন ডেটাসেট চেঞ্জড () অবহিত করবেন তখন কি হবে। ভিউটি সম্পাদনা করা দেখতে আপনি অনবিন্দ ভিউহোল্ডারটি ডিবাগ করতে পারেন।
ক্রিস

1
@ ইগোরগানাপলস্কি আপনার ArrayList<T>যে ধরণের বস্তু যুক্ত করতে চান তা ব্যবহার করতে হবে, উদাহরণস্বরূপ ArrayList<ViewGroup>পরিবর্তে ArrayList<String>। তারপর আপনি শুধু থেকে যুক্তি টাইপ পরিবর্তন করতে পারেন Stringথেকে ViewGroup। (নেক্রোর জন্য দুঃখিত)
এরিক রিড

14

আপনি যদি তালিকায় একাধিক আইটেম যুক্ত করে থাকেন তবে এটি ব্যবহার করুন:

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

এটি কোনও নিবন্ধিত পর্যবেক্ষককে অবহিত করবে যে পজিশন স্টার্ট থেকে শুরু হওয়া বর্তমানে প্রতিফলিত আইটেমকাউন্ট আইটেমগুলি সদ্য inোকানো হয়েছে। পূর্বে পজিশন স্টার্ট এবং এর বাইরে অবস্থিত আইটেমটি এখন পজিশনস্টার্ট + আইটেমকাউন্ট থেকে শুরু করে পাওয়া যাবে

ডেটাসেটে বিদ্যমান আইটেম এখনও আপ টু ডেট বিবেচনা করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.