রিসাইক্লারভিউ অ্যাডাপ্টার ডেটা কীভাবে আপডেট করবেন?


273

আপডেট করার RecyclerViewঅ্যাডাপ্টারে সমস্যাটি কী তা বোঝার চেষ্টা করছেন ।

আমি পণ্যের নতুন তালিকা পাওয়ার পরে, আমি চেষ্টা করেছিলাম:

  1. ArrayListযেখানে খণ্ড recyclerViewতৈরি হয়েছে তা আপডেট করুন , অ্যাডাপ্টারে নতুন ডেটা সেট করুন, তারপরে কল করুন adapter.notifyDataSetChanged(); এটা কাজ করে না.

  2. অন্যদের মতো একটি নতুন অ্যাডাপ্টার তৈরি করুন এবং এটি তাদের জন্য কাজ করেছে, তবে আমার জন্য কোনও পরিবর্তন হয়নি: recyclerView.setAdapter(new RecyclerViewAdapter(newArrayList))

  3. একটি পদ্ধতি তৈরি করুন Adapterযাতে নিম্নলিখিত হিসাবে ডেটা আপডেট হয়:

    public void updateData(ArrayList<ViewModel> viewModels) {
       items.clear();
       items.addAll(viewModels);
       notifyDataSetChanged();
    }
    

    তারপরে আমি যখনই ডেটা তালিকা আপডেট করতে চাই তখন এই পদ্ধতিটি কল করি; এটা কাজ করে না.

  4. আমি যে কোনও উপায়ে পুনর্ব্যবহারযোগ্য ভিউ সংশোধন করতে পারি কিনা তা যাচাই করতে এবং আমি কমপক্ষে একটি আইটেম সরানোর চেষ্টা করেছি:

     public void removeItem(int position) {
        items.remove(position);
        notifyItemRemoved(position);
    }
    

    সবকিছু যেমন ছিল তেমন রয়ে গেছে।

আমার অ্যাডাপ্টারটি এখানে:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> implements View.OnClickListener {

    private ArrayList<ViewModel> items;
    private OnItemClickListener onItemClickListener;

    public RecyclerViewAdapter(ArrayList<ViewModel> items) {
        this.items = items;
    }


    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycler, parent, false);
        v.setOnClickListener(this);
        return new ViewHolder(v);
    }

    public void updateData(ArrayList<ViewModel> viewModels) {
        items.clear();
        items.addAll(viewModels);
        notifyDataSetChanged();
    }
    public void addItem(int position, ViewModel viewModel) {
        items.add(position, viewModel);
        notifyItemInserted(position);
    }

    public void removeItem(int position) {
        items.remove(position);
        notifyItemRemoved(position);
    }



    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        ViewModel item = items.get(position);
        holder.title.setText(item.getTitle());
        Picasso.with(holder.image.getContext()).load(item.getImage()).into(holder.image);
        holder.price.setText(item.getPrice());
        holder.credit.setText(item.getCredit());
        holder.description.setText(item.getDescription());

        holder.itemView.setTag(item);
    }

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

    @Override
    public void onClick(final View v) {
        // Give some time to the ripple to finish the effect
        if (onItemClickListener != null) {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    onItemClickListener.onItemClick(v, (ViewModel) v.getTag());
                }
            }, 0);
        }
    }

    protected static class ViewHolder extends RecyclerView.ViewHolder {
        public ImageView image;
        public TextView price, credit, title, description;

        public ViewHolder(View itemView) {
            super(itemView);
            image = (ImageView) itemView.findViewById(R.id.image);
            price = (TextView) itemView.findViewById(R.id.price);
            credit = (TextView) itemView.findViewById(R.id.credit);
            title = (TextView) itemView.findViewById(R.id.title);
            description = (TextView) itemView.findViewById(R.id.description);
        }
    }

    public interface OnItemClickListener {

        void onItemClick(View view, ViewModel viewModel);

    }
}

এবং আমি RecyclerViewনিম্নলিখিত হিসাবে সূচনা :

recyclerView = (RecyclerView) view.findViewById(R.id.recycler);
recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 5));
adapter = new RecyclerViewAdapter(items);
adapter.setOnItemClickListener(this);
recyclerView.setAdapter(adapter);

সুতরাং, নতুন প্রাপ্ত আইটেমগুলি প্রদর্শনের জন্য আমি কীভাবে আসলে অ্যাডাপ্টার ডেটা আপডেট করব?


আপডেট: সমস্যাটি হ'ল গ্রিডভিউ যেখানে লেআউটটি নীচে দেখানো হয়েছিল:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:tag="catalog_fragment"
    android:layout_height="match_parent">

    <FrameLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipToPadding="false"/>

        <ImageButton
            android:id="@+id/fab"
            android:layout_gravity="top|end"
            style="@style/FabStyle"/>

    </FrameLayout>
</LinearLayout>

তারপরে আমি সবে সরিয়ে প্যারেন্ট লেআউট হিসাবে LinearLayoutতৈরি করেছি FrameLayout


items.clear(); items.addAll(newItems);একটি কুৎসিত প্যাটার্ন। যদি আপনার এখানে সত্যিকারের ডিফেন্সিভ অনুলিপি প্রয়োজন হয় items = new ArrayList(newItems);তবে কম কুরুচিপূর্ণ হবে।
মিহা_ x64

2
@ মিহা-এক্স 64 আপনি ঠিক বলেছেন - এটি কম কুশ্রী হবে। সমস্যাটি হ'ল এটি কেবল কাজ করে না। অ্যাডাপ্টার রেফারেন্সের কোনও রেফারেন্স পায় না। এটি রেফারেন্স নিজেই পায়। সুতরাং যদি আপনি একটি নতুন ডেটাसेट তৈরি করেন তবে এটিতে একটি নতুন রেফারেন্স রয়েছে যখন অ্যাডাপ্টার এখনও কেবল পুরানোটিকেই জানেন।
অবিশ্বাস্য জানুয়ারী

উত্তর:


325

আমি রিসাইক্লারভিউয়ের সাথে কাজ করছি এবং অপসারণ এবং আপডেট উভয়ই ভাল কাজ করে।

1) সরান: একটি পুনর্ব্যবহারযোগ্য ভিউ থেকে একটি আইটেম অপসারণ 4 টি পদক্ষেপ আছে

list.remove(position);
recycler.removeViewAt(position);
mAdapter.notifyItemRemoved(position);                 
mAdapter.notifyItemRangeChanged(position, list.size());

কোডগুলির এই লাইনটি আমার পক্ষে কাজ করে।

2) ডেটা আপডেট করুন: আমার একমাত্র কাজ করতে হবে

mAdapter.notifyDataSetChanged();

আপনাকে এ্যাকটিভিটি / ফ্রেগমেন্ট কোডে রিসাইক্লারভিউ অ্যাডাপ্টার কোডে নয় এগুলি করতে হয়েছিল।


2
ধন্যবাদ. আপডেট পরীক্ষা করুন। একরকম, লিনিয়ার লেআউটটি রিসেলারভিউ আপডেট তালিকাকে দেয় না।
ফিলিপ লুচিয়েনকো

40
আপনার কেবলমাত্র এই দুটি লাইন প্রয়োজন: list.remove (অবস্থান); (অবস্থান) mAdapter.notifyItemRemoved;
ফিশাল

3
আমার জন্য, লাইনগুলি recycler.removeViewAt(position);(বা বরং recycler.removeAllViews()) অত্যন্ত গুরুত্বপূর্ণ ছিল।
এমএসপিড

2
মোছার সময় বিরক্তিকর ত্রুটি এড়াতে একটি গুরুত্বপূর্ণ বিবেচনা: আপনার এই লাইনটিকে রিসাইকেল.আরমেভভিউএটি (অবস্থান) বলার দরকার নেই;
অ্যাঞ্জেলো নোদারী

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

328

এটি ভবিষ্যতের দর্শকদের জন্য একটি সাধারণ উত্তর answer অ্যাডাপ্টার ডেটা আপডেট করার বিভিন্ন উপায় ব্যাখ্যা করা হয়েছে। প্রক্রিয়াটিতে প্রতিবার দুটি প্রধান পদক্ষেপ অন্তর্ভুক্ত থাকে:

  1. ডেটা সেট আপডেট করুন
  2. পরিবর্তনের অ্যাডাপ্টারকে অবহিত করুন

একক আইটেম .োকান

সূচিতে "পিগ" যুক্ত করুন 2

একক আইটেম .োকান

String item = "Pig";
int insertIndex = 2;
data.add(insertIndex, item);
adapter.notifyItemInserted(insertIndex);

একাধিক আইটেম .োকান

সূচকে আরও তিনটি প্রাণী .োকান 2

একাধিক আইটেম .োকান

ArrayList<String> items = new ArrayList<>();
items.add("Pig");
items.add("Chicken");
items.add("Dog");
int insertIndex = 2;
data.addAll(insertIndex, items);
adapter.notifyItemRangeInserted(insertIndex, items.size());

একক আইটেম সরান

তালিকা থেকে "পিগ" সরান।

একক আইটেম সরান

int removeIndex = 2;
data.remove(removeIndex);
adapter.notifyItemRemoved(removeIndex);

একাধিক আইটেম সরান

তালিকা থেকে "উট" এবং "ভেড়া" সরান।

একাধিক আইটেম সরান

int startIndex = 2; // inclusive
int endIndex = 4;   // exclusive
int count = endIndex - startIndex; // 2 items will be removed
data.subList(startIndex, endIndex).clear();
adapter.notifyItemRangeRemoved(startIndex, count);

সমস্ত আইটেম সরান

পুরো তালিকা সাফ করুন।

সমস্ত আইটেম সরান

data.clear();
adapter.notifyDataSetChanged();

পুরানো তালিকাটি নতুন তালিকার সাথে প্রতিস্থাপন করুন

পুরানো তালিকা সাফ করুন তারপরে একটি নতুন তালিকা যুক্ত করুন।

পুরানো তালিকাটি নতুন তালিকার সাথে প্রতিস্থাপন করুন

// clear old list
data.clear();

// add new list
ArrayList<String> newList = new ArrayList<>();
newList.add("Lion");
newList.add("Wolf");
newList.add("Bear");
data.addAll(newList);

// notify adapter
adapter.notifyDataSetChanged();

adapterএকটি রেফারেন্স রয়েছে dataতাই এটি গুরুত্বপূর্ণ যে আমি সেট না, dataএকটি নতুন বস্তু। পরিবর্তে আমি পুরানো আইটেমগুলি সাফ করেছিলাম dataএবং তারপরে নতুনগুলি যুক্ত করেছি।

একক আইটেম আপডেট করুন

"ভেড়া" আইটেমটি পরিবর্তন করুন যাতে এটি বলে যে "আমি ভেড়া পছন্দ করি।"

একক আইটেম আপডেট করুন

String newValue = "I like sheep.";
int updateIndex = 3;
data.set(updateIndex, newValue);
adapter.notifyItemChanged(updateIndex);

একক আইটেম সরান

অবস্থান থেকে "মেষ" সরান 3অবস্থানে 1

একক আইটেম সরান

int fromPosition = 3;
int toPosition = 1;

// update data array
String item = data.get(fromPosition);
data.remove(fromPosition);
data.add(toPosition, item);

// notify adapter
adapter.notifyItemMoved(fromPosition, toPosition);

কোড

আপনার রেফারেন্সের জন্য এই প্রকল্প কোড এখানে। এই উত্তরে পুনর্ব্যবহারযোগ্য অ্যাডাপ্টার কোডটি পাওয়া যাবে ।

MainActivity.java

public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener {

    List<String> data;
    MyRecyclerViewAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // data to populate the RecyclerView with
        data = new ArrayList<>();
        data.add("Horse");
        data.add("Cow");
        data.add("Camel");
        data.add("Sheep");
        data.add("Goat");

        // set up the RecyclerView
        RecyclerView recyclerView = findViewById(R.id.rvAnimals);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
                layoutManager.getOrientation());
        recyclerView.addItemDecoration(dividerItemDecoration);
        adapter = new MyRecyclerViewAdapter(this, data);
        adapter.setClickListener(this);
        recyclerView.setAdapter(adapter);
    }

    @Override
    public void onItemClick(View view, int position) {
        Toast.makeText(this, "You clicked " + adapter.getItem(position) + " on row number " + position, Toast.LENGTH_SHORT).show();
    }

    public void onButtonClick(View view) {
        insertSingleItem();
    }

    private void insertSingleItem() {
        String item = "Pig";
        int insertIndex = 2;
        data.add(insertIndex, item);
        adapter.notifyItemInserted(insertIndex);
    }

    private void insertMultipleItems() {
        ArrayList<String> items = new ArrayList<>();
        items.add("Pig");
        items.add("Chicken");
        items.add("Dog");
        int insertIndex = 2;
        data.addAll(insertIndex, items);
        adapter.notifyItemRangeInserted(insertIndex, items.size());
    }

    private void removeSingleItem() {
        int removeIndex = 2;
        data.remove(removeIndex);
        adapter.notifyItemRemoved(removeIndex);
    }

    private void removeMultipleItems() {
        int startIndex = 2; // inclusive
        int endIndex = 4;   // exclusive
        int count = endIndex - startIndex; // 2 items will be removed
        data.subList(startIndex, endIndex).clear();
        adapter.notifyItemRangeRemoved(startIndex, count);
    }

    private void removeAllItems() {
        data.clear();
        adapter.notifyDataSetChanged();
    }

    private void replaceOldListWithNewList() {
        // clear old list
        data.clear();

        // add new list
        ArrayList<String> newList = new ArrayList<>();
        newList.add("Lion");
        newList.add("Wolf");
        newList.add("Bear");
        data.addAll(newList);

        // notify adapter
        adapter.notifyDataSetChanged();
    }

    private void updateSingleItem() {
        String newValue = "I like sheep.";
        int updateIndex = 3;
        data.set(updateIndex, newValue);
        adapter.notifyItemChanged(updateIndex);
    }

    private void moveSingleItem() {
        int fromPosition = 3;
        int toPosition = 1;

        // update data array
        String item = data.get(fromPosition);
        data.remove(fromPosition);
        data.add(toPosition, item);

        // notify adapter
        adapter.notifyItemMoved(fromPosition, toPosition);
    }
}

মন্তব্য

  • আপনি যদি ব্যবহার করেন notifyDataSetChanged()তবে কোনও অ্যানিমেশন সম্পাদন করা হবে না। এটি একটি ব্যয়বহুল ক্রিয়াকলাপও হতে পারে, সুতরাং notifyDataSetChanged()আপনি যদি কেবলমাত্র একটি আইটেম বা বিস্তৃত আইটেম আপডেট করেন তবে এটি ব্যবহার করার পরামর্শ দেওয়া হয় না ।
  • আপনি যদি কোনও তালিকায় বড় বা জটিল পরিবর্তন করে থাকেন তবে ডিফুটিল ব্যবহার করে দেখুন ।

আরও অধ্যয়ন


5
দুর্দান্ত উত্তর! কোনও আইটেম প্রতিস্থাপনের সময় পদক্ষেপগুলি কী হবে, যার ফলশ্রুতিতে ভিন্ন ধরণের ফলাফল আসবে? এটি কি কেবলমাত্র सूचित আইটেম চেঞ্জ করা বা একটি সন্নিবেশের পরে সম্মিলিত অপসারণ?
Semaphor

আপনার ন্যূনতম উদাহরণের সাথে দেখে মনে হচ্ছে notifyIttem চেঞ্জ করা যথেষ্ট। এটি পরিবর্তিত আইটেমটির জন্য ক্রেইটভিউহোল্ডার এবং অনবিন্দভিউহোল্ডার কল করবে এবং ভিন্ন ভিউ প্রদর্শিত হবে। কোনও আইটেম আপডেট করার ক্ষেত্রে আমার একটি অ্যাপ্লিকেশনটিতে সমস্যা ছিল যার ফলস্বরূপ ভিন্ন দৃষ্টিভঙ্গি দেখাবে, তবে মনে হচ্ছে অন্য সমস্যা রয়েছে।
সেমফোর

@ আমার প্রশ্ন সম্পর্কে কোনও ধারণা সুরাকা: স্ট্যাকওভারফ্লো / প্রশ্ন / 73৩৩৩২২২/২ আমি এই থ্রেডে তালিকাভুক্ত সমস্ত কিছুই চেষ্টা করেছি কিন্তু কোন

কীভাবে আমরা পরিবর্তন করতে ডিফুটিল ব্যবহার করি? এগুলি ম্যানুয়ালি কল করার মতো তরল নয় <<অ্যাকশন> () উল্লেখ করুন।
গিলি

1
সত্যিই বলটি নীচে ফেলে দেওয়া Update single itemহয়েছে, আমার কচ্ছপগুলির মতো

46

এটিই আমার পক্ষে কাজ করেছে:

recyclerView.setAdapter(new RecyclerViewAdapter(newList));
recyclerView.invalidate();

একটি নতুন অ্যাডাপ্টার তৈরির পরে আপডেট তালিকা রয়েছে (আমার ক্ষেত্রে এটি একটি অ্যারেলিস্টে রূপান্তরিত একটি ডাটাবেস ছিল) এবং অ্যাডাপ্টার হিসাবে সেট করার পরে, আমি চেষ্টা করেছি recyclerView.invalidate()এবং এটি কাজ করেছে।


12
এটি কি পরিবর্তিত আইটেমগুলি আপডেট করার পরিবর্তে পুরো দৃশ্যটি রিফ্রেশ করবে না?
তুইলি

13
প্রতিবার নতুন অ্যাডাপ্টার তৈরি করার পরিবর্তে, আমি যা করেছি তা হ'ল নতুন তালিকাটি সেট করার জন্য আমার কাস্টম অ্যাডাপ্টারের শ্রেণিতে একটি সেটার পদ্ধতি তৈরি করা। তারপরে, কেবল এটি বলার জন্য ফোন করুন YourAdapter adapter = (YourAdapter) recyclerView.getAdapter(); adapter.yourSetterMethod(newList); adapter.notifyDataSetChanged();, এটি ওপি প্রথমে কী চেষ্টা করেছে বলে মনে হচ্ছে (এটি একটি মন্তব্য হিসাবে এটিকে যুক্ত করা যাতে এটি অন্য কাউকে সহায়তা করতে পারে, যেমনটি আমার ক্ষেত্রে কাজ করেছিল)।
কেভিন লি

2
পাঠক, এটির জন্য নিষ্পত্তি করবেন না। এই উত্তরটি কার্যকর, তবে আরও কার্যকর উপায় আছে। সমস্ত ডেটা আবার লোড করার পরিবর্তে , সবচেয়ে কার্যকর উপায় হ'ল অ্যাডাপ্টারে নতুন ডেটা যুক্ত করা।
সেবাস্তিয়ালসনো

হ্যাঁ আমি @ টিউবিলির সাথে একমত, এটি ইউআই-তে সম্পূর্ণ দর্শন পুনরায় চিত্রিত করবে।
রাহুল

18

এটি করার জন্য আপনার কাছে দুটি বিকল্প রয়েছে: অ্যাডাপ্টার থেকে ইউআই রিফ্রেশ করুন:

mAdapter.notifyDataSetChanged();

অথবা এটিকে রিসাইক্লারভিউ থেকে রিফ্রেশ করুন:

recyclerView.invalidate();

15

অন্য বিকল্প হ'ল ডিফুটিল ব্যবহার করা । এটি নতুন তালিকার বিপরীতে মূল তালিকার তুলনা করবে এবং কোনও পরিবর্তন হলে নতুন তালিকাটিকে আপডেট হিসাবে ব্যবহার করবে।

মূলত, আমরা পুরানো ডেটা বনাম নতুন ডেটার তুলনা করতে ডিফুটিল ব্যবহার করতে পারি এবং এটি আপনার পক্ষে বিজ্ঞপ্তি আইটেমরঞ্জারভেস্ট করুন এবং বিজ্ঞপ্তি আইটেমরঞ্জ চ্যাঞ্জড এবং নোটিফাই আইটেমরেঞ্জইন্ট করা যাক।

বিজ্ঞপ্তি ডেটাসেট পরিবর্তিত পরিবর্তে ডিফুটিল ব্যবহারের একটি দ্রুত উদাহরণ:

DiffResult diffResult = DiffUtil
                .calculateDiff(new MyDiffUtilCB(getItems(), items));

//any clear up on memory here and then
diffResult.dispatchUpdatesTo(this);

//and then, if necessary
items.clear()
items.addAll(newItems)

আমি ক্যালকুলেট ডিফটি একটি বড় তালিকা তৈরির ক্ষেত্রে মূল থ্রেডের কাজ করি।


1
যদিও এটি সঠিক, আপনার অ্যাডাপ্টারের অভ্যন্তরে ডেটা কীভাবে আপডেট করবেন? ধরা যাক আমি অ্যাডাপ্টারে তালিকার <অবজেক্ট> প্রদর্শন করছি এবং আমি তালিকা <অবজেক্ট> সহ একটি নতুন আপডেট পেয়েছি। ডিফুটিল একটি পার্থক্য গণনা করবে এবং এটি অ্যাডাপ্টারে প্রেরণ করবে, তবে এটি মূল বা নতুন তালিকার সাথে কিছুই করছে না (আপনার ক্ষেত্রে getItems()
you

1
হতে পারে এই নিবন্ধটি সাহায্য করতে পারে। .. medium.com/@nullthemall/...
j2emanue

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

আমার সম্পর্কে কোন ধারণা? : আমি এখানে তালিকাভুক্ত সবকিছু কিন্তু কোন ভাগ্য চেষ্টা stackoverflow.com/questions/57332222/...

আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ! আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন আমাকে প্রেরণের পরে "পরিষ্কার" & "অ্যাডএল" করা উচিত ?? Tnx!
আদি আজারিয়া

10

তালিকাভিউ, গ্রিডভিউ এবং পুনর্ব্যবহারযোগ্য দর্শন আপডেট করুন

mAdapter.notifyDataSetChanged();

অথবা

mAdapter.notifyItemRangeChanged(0, itemList.size());

ব্যবহারকারী স্ক্রোলিং শুরু না করা পর্যন্ত এটি আমার ডেটা আপডেট করে বলে মনে হচ্ছে না। আমি সমস্ত জায়গা দেখেছি এবং বুঝতে পারছি না কেন ..
সুডোপ্লাজ

@SudoPlz কাস্টম স্ক্রল শ্রোতা ব্যাবহার করতে পারে স্ক্রল সনাক্ত করতে এবং মত আপনার অবহিত ক্রিয়াকলাপটি সম্পাদন stackoverflow.com/a/31174967/4401692
পঙ্কজ Talaviya

ধন্যবাদ পঙ্কজ কিন্তু ঠিক এটাই আমি এড়াতে চাইছি। ব্যবহারকারীর স্ক্রিনটি স্পর্শ না করেই আমি সবকিছু আপডেট করতে চাই।
সুডোপ্লাজ

5

বর্তমান ডেটাতে নতুন ডেটা যুক্ত করার সর্বোত্তম এবং দুর্দান্ততম উপায়

 ArrayList<String> newItems = new ArrayList<String>();
 newItems = getList();
 int oldListItemscount = alcontainerDetails.size();
 alcontainerDetails.addAll(newItems);           
 recyclerview.getAdapter().notifyItemChanged(oldListItemscount+1, al_containerDetails);

2
আমি সমস্ত কিছুর জন্য "notifyDataSetChanged" লোকেদের ব্যবহার দেখছি, ওভারকিল কি তাই না? মানে, পুরো তালিকাটি পুনরায় লোড করুন কারণ কয়েকটি পরিবর্তন হয়েছে বা যুক্ত করা হয়েছিল ... আমি এই পদ্ধতির পছন্দ করি, এখনই "notifyItemRangeInsert" পদ্ধতিতে বাস্তবায়ন করা হয়েছিল।
ভিজিটর হুগো শোয়াব

5

আমি একই সমস্যাটিকে অন্যভাবে সমাধান করেছি। ব্যাকগ্রাউন্ড থ্রেড থেকে আমি অপেক্ষা করছি এমন ডেটা আমার কাছে নেই সুতরাং একটি এমিটি তালিকা দিয়ে শুরু করুন।

        mAdapter = new ModelAdapter(getContext(),new ArrayList<Model>());
   // then when i get data

        mAdapter.update(response.getModelList());
  //  and update is in my adapter

        public void update(ArrayList<Model> modelList){
            adapterModelList.clear(); 
            for (Product model: modelList) {
                adapterModelList.add(model); 
            }
           mAdapter.notifyDataSetChanged();
        }

এটাই.


2

এই পদ্ধতিগুলি একটি বেসিক ব্যবহার শুরু করার জন্য দক্ষ এবং ভাল RecyclerView

private List<YourItem> items;

public void setItems(List<YourItem> newItems)
{
    clearItems();
    addItems(newItems);
}

public void addItem(YourItem item, int position)
{
    if (position > items.size()) return;

    items.add(item);
    notifyItemInserted(position);
}

public void addMoreItems(List<YourItem> newItems)
{
    int position = items.size() + 1;
    newItems.addAll(newItems);
    notifyItemChanged(position, newItems);
}

public void addItems(List<YourItem> newItems)
{
    items.addAll(newItems);
    notifyDataSetChanged();
}

public void clearItems()
{
    items.clear();
    notifyDataSetChanged();
}

public void addLoader()
{
    items.add(null);
    notifyItemInserted(items.size() - 1);
}

public void removeLoader()
{
    items.remove(items.size() - 1);
    notifyItemRemoved(items.size());
}

public void removeItem(int position)
{
    if (position >= items.size()) return;

    items.remove(position);
    notifyItemRemoved(position);
}

public void swapItems(int positionA, int positionB)
{
    if (positionA > items.size()) return;
    if (positionB > items.size()) return;

    YourItem firstItem = items.get(positionA);

    videoList.set(positionA, items.get(positionB));
    videoList.set(positionB, firstItem);

    notifyDataSetChanged();
}

আপনি এগুলি অ্যাডাপ্টারের শ্রেণীর ভিতরে বা আপনার খণ্ড বা ক্রিয়াকলাপের মধ্যে প্রয়োগ করতে পারেন তবে সেক্ষেত্রে আপনাকে বিজ্ঞপ্তি পদ্ধতিগুলিতে কল করতে অ্যাডাপ্টার ইনস্ট্যান্ট করতে হবে। আমার ক্ষেত্রে আমি সাধারণত এটি অ্যাডাপ্টারে প্রয়োগ করি।


2

আমি খুঁজে পেয়েছি যে রিসাইক্লারউভিউ পুনরায় লোড করার একটি খুব সহজ উপায় হল কেবল কল করা

recyclerView.removeAllViews();

এটি প্রথমে রিসাইক্লিউউয়ের সমস্ত সামগ্রী সরিয়ে ফেলবে এবং তারপরে আপডেট হওয়া মানগুলির সাথে এটি আবার যুক্ত করবে।


2
দয়া করে এটি ব্যবহার করবেন না। আপনি সমস্যার জন্য জিজ্ঞাসা করা হবে।
dell116

1

আমি দীর্ঘ সময় পরে উত্তর পেয়েছি

  SELECTEDROW.add(dt);
                notifyItemInserted(position);
                SELECTEDROW.remove(position);
                notifyItemRemoved(position);

0

উপরের মন্তব্যে উল্লিখিত কিছুই যদি আপনার পক্ষে কাজ করে না। এর অর্থ সমস্যাটি অন্য কোথাও রয়েছে mean

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

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