Làm cách nào để cập nhật dữ liệu bộ chuyển đổi RecyclerView?


273

Cố gắng tìm hiểu vấn đề với việc cập nhật RecyclerViewAdaptor là gì.

Sau khi tôi nhận được Danh sách sản phẩm mới, tôi đã cố gắng:

  1. Cập nhật đoạn ArrayListtừ nơi recyclerViewđược tạo, đặt dữ liệu mới vào bộ điều hợp, sau đó gọi adapter.notifyDataSetChanged(); nó không hoạt động

  2. Tạo một bộ chuyển đổi mới, như những người khác đã làm, và nó hoạt động với họ, nhưng không thay đổi đối với tôi: recyclerView.setAdapter(new RecyclerViewAdapter(newArrayList))

  3. Tạo một phương thức Adaptercập nhật dữ liệu như sau:

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

    Sau đó, tôi gọi phương thức này bất cứ khi nào tôi muốn cập nhật danh sách dữ liệu; nó không hoạt động

  4. Để kiểm tra xem tôi có thể sửa đổi recyclerView theo bất kỳ cách nào không và tôi đã cố gắng xóa ít nhất một mục:

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

    Mọi thứ vẫn như cũ.

Đây là bộ chuyển đổi của tôi:

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);

    }
}

Và tôi khởi xướng RecyclerViewnhư sau:

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

Vì vậy, làm thế nào để tôi thực sự cập nhật dữ liệu bộ điều hợp để hiển thị các mục mới nhận được?


Cập nhật: vấn đề là bố cục nơi GridView được xem như sau:

<?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>

Sau đó, tôi chỉ cần loại bỏ LinearLayoutvà thực hiện FrameLayoutnhư bố trí cha mẹ.


items.clear(); items.addAll(newItems);là một mô hình xấu xí. Nếu bạn thực sự cần sao chép phòng thủ ở đây, items = new ArrayList(newItems);sẽ bớt xấu xí hơn.
Miha_x64

2
@ miha-x64 Bạn nói đúng - nó sẽ ít xấu xí hơn. Vấn đề là điều này không hiệu quả. Các bộ chuyển đổi không có tham chiếu đến tài liệu tham khảo. Nó được tham khảo chính nó. Vì vậy, nếu bạn xây dựng một tập dữ liệu mới, nó có một tham chiếu mới trong khi bộ điều hợp vẫn chỉ biết cái cũ.
đáng kinh ngạc

Câu trả lời:


325

Tôi đang làm việc với RecyclerView và cả bản gỡ bỏ và bản cập nhật đều hoạt động tốt.

1) XÓA: Có 4 bước để xóa một mục khỏi RecyclerView

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

Những dòng mã này làm việc cho tôi.

2) CẬP NHẬT DỮ LIỆU: Điều duy nhất tôi phải làm là

mAdapter.notifyDataSetChanged();

Bạn phải thực hiện tất cả những điều này trong mã Actvity / Fragment chứ không phải trong mã RecyclerView Adaptor.


2
Cảm ơn bạn. Vui lòng kiểm tra cập nhật. Bằng cách nào đó, bố cục tuyến tính không cho phép danh sách cập nhật RecylerView.
Filip Luchianenco 12/07/2015

40
bạn chỉ cần hai dòng này: list.remove (vị trí); mAd CHƯƠNG.notifyItemRemond (vị trí);
phong kiến

3
Đối với tôi, các dòng recycler.removeViewAt(position);(hay đúng hơn recycler.removeAllViews()) là những người quan trọng.
MSpeed

2
Một cân nhắc quan trọng để tránh sự cố khó chịu trong quá trình xóa: Bạn không cần phải gọi dòng này recycler.removeViewAt (vị trí);
Angelo Nodari

7
NotifyDataSetChanged là quá mức cần thiết, đặc biệt nếu bạn đang xử lý các danh sách dài RẤT. Tải lại toàn bộ cho một vài mục? Không, cám ơn. Ngoài ra, recycler.removeViewAt (vị trí)? Không cần thiết. Và không cần phải gọi cả "mAd CHƯƠNG.notifyItemRemond (vị trí)" và "mAd Module.notifyItemRangeChanged (vị trí, list.size ())". Loại bỏ một số, hoặc loại bỏ một. Thông báo cho ONCE. Gọi một trong số họ.
Vitor Hugo Schwaab

327

Đây là một câu trả lời chung cho du khách trong tương lai. Các cách khác nhau để cập nhật dữ liệu bộ điều hợp được giải thích. Quá trình này bao gồm hai bước chính mỗi lần:

  1. Cập nhật tập dữ liệu
  2. Thông báo cho bộ chuyển đổi thay đổi

Chèn một mục duy nhất

Thêm "Lợn" tại chỉ mục 2.

Chèn một mục duy nhất

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

Chèn nhiều mục

Chèn thêm ba con vật vào chỉ mục 2.

Chèn nhiều mục

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());

Xóa một mục duy nhất

Xóa "Lợn" khỏi danh sách.

Xóa một mục duy nhất

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

Xóa nhiều mục

Xóa "Lạc đà" và "Cừu" khỏi danh sách.

Xóa nhiều mục

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);

Xóa tất cả các mục

Xóa toàn bộ danh sách.

Xóa tất cả các mục

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

Thay thế danh sách cũ bằng danh sách mới

Xóa danh sách cũ sau đó thêm một danh sách mới.

Thay thế danh sách cũ bằng danh sách mới

// 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();

adaptercó một tài liệu tham khảo data, vì vậy điều quan trọng là tôi đã không đặt datađối tượng mới. Thay vào đó tôi xóa các mục cũ từ datavà sau đó thêm các mục mới.

Cập nhật mục duy nhất

Thay đổi mục "Cừu" để thông báo "Tôi thích cừu".

Cập nhật mục duy nhất

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

Di chuyển mục duy nhất

Di chuyển "Cừu" từ vị trí này 3sang vị trí khác 1.

Di chuyển mục duy nhất

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);

Đây là mã dự án để bạn tham khảo. Mã AdyclerView có thể được tìm thấy tại câu trả lời này .

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);
    }
}

Ghi chú

  • Nếu bạn sử dụng notifyDataSetChanged(), sau đó không có hình ảnh động sẽ được thực hiện. Đây cũng có thể là một hoạt động đắt tiền, vì vậy không nên sử dụng notifyDataSetChanged()nếu bạn chỉ cập nhật một mục duy nhất hoặc một loạt các mục.
  • Kiểm tra DiffUtil nếu bạn đang thực hiện các thay đổi lớn hoặc phức tạp cho một danh sách.

Học cao hơn


5
Câu trả lời tuyệt vời! Điều gì sẽ là các bước khi thay thế một mục, điều này sẽ dẫn đến một kiểu xem khác nhau? Có phải nó chỉ thông báoItemChanged hoặc loại bỏ kết hợp theo sau bởi một chèn?
Semaphor

Với ví dụ tối thiểu của bạn, có vẻ như notifyItemChanged là đủ. Nó sẽ gọi onCreateViewHolder và onBindViewHolder cho mục đã thay đổi và chế độ xem khác nhau được hiển thị. Tôi gặp sự cố trong một ứng dụng cập nhật một mục sẽ dẫn đến một chế độ xem khác, nhưng dường như có một vấn đề khác.
Semaphor

@Suragch bất kỳ ý tưởng nào về câu hỏi của tôi: stackoverflow.com/questions/57332222/NH Tôi đã thử mọi thứ được liệt kê trong chủ đề này nhưng không có kết quả :(

Làm thế nào về khi chúng ta sử dụng DiffUtils để thực hiện thay đổi? Chúng không quá trôi chảy như gọi thủ công .notify <Action> ().
GuilhE

1
Thực sự thả quả bóng xuống Update single item, đáng ra tôi phải như rùa
ardew

46

Đây là những gì làm việc cho tôi:

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

Sau khi tạo bộ điều hợp mới chứa danh sách đã cập nhật (trong trường hợp của tôi, đó là cơ sở dữ liệu được chuyển đổi thành ArrayList) và thiết lập đó là bộ điều hợp, tôi đã thử recyclerView.invalidate()và nó hoạt động.


12
Điều này sẽ không làm mới toàn bộ chế độ xem thay vì chỉ cập nhật các mục đã thay đổi?
TWilly

13
Thay vì tạo bộ điều hợp mới mỗi lần, điều tôi đã làm là tạo một phương thức setter trong lớp bộ điều hợp tùy chỉnh của mình để đặt danh sách mới. Sau đó, chỉ cần gọi YourAdapter adapter = (YourAdapter) recyclerView.getAdapter(); adapter.yourSetterMethod(newList); adapter.notifyDataSetChanged();Điều đó đang được nói, có vẻ như những gì OP đã thử trước tiên (chỉ cần thêm điều này vào như một nhận xét để nó có thể giúp đỡ người khác, vì điều đó đã hoạt động trong trường hợp của tôi).
Kevin Lee

2
Độc giả, đừng giải quyết việc này. Câu trả lời này hoạt động, nhưng có một cách hiệu quả hơn. Thay vì tải lại tất cả dữ liệu một lần nữa , cách hiệu quả nhất là chỉ cần thêm dữ liệu mới vào bộ điều hợp.
Sebastialonso

Có, tôi đồng ý với @TWilly, nó sẽ vẽ lại toàn bộ View trên UI.
Raul

18

bạn có 2 tùy chọn để thực hiện việc này: làm mới UI từ bộ điều hợp:

mAdapter.notifyDataSetChanged();

hoặc làm mới nó từ recyclerView:

recyclerView.invalidate();

15

Một lựa chọn khác là sử dụng diffutil . Nó sẽ so sánh danh sách ban đầu với danh sách mới và sử dụng danh sách mới làm bản cập nhật nếu có thay đổi.

Về cơ bản, chúng ta có thể sử dụng DiffUtil để so sánh dữ liệu cũ với dữ liệu mới và để nó gọi notifyItemRangeRemond, và notifyItemRangeChanged và notifyItemRangeInserted thay mặt bạn.

Một ví dụ nhanh về việc sử dụng diffUtil thay vì notifyDataSetChanged:

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)

Tôi thực hiện tính toánDiff ngoài luồng chính trong trường hợp đó là một danh sách lớn.


1
Mặc dù điều này là chính xác, làm thế nào để cập nhật dữ liệu bên trong bộ chuyển đổi của bạn? Giả sử tôi đang hiển thị Danh sách <Đối tượng> trong bộ điều hợp và tôi nhận được bản cập nhật mới với Danh sách <Đối tượng>. DiffUtil sẽ tính toán một sự khác biệt và gửi nó trong bộ điều hợp, nhưng nó không làm gì với danh sách gốc hoặc mới (trong trường hợp của bạn getItems(). Làm thế nào để bạn biết dữ liệu nào từ danh sách gốc cần được xóa / thêm / cập nhật?
vanomart

1
Có lẽ bài viết này có thể giúp đỡ. .. Medium.com/@nullthemall/ từ
j2emanue

@vanomart bạn chỉ phải thay thế trực tiếp trường danh sách cục bộ của mình bằng giá trị danh sách mới như bạn thường làm, sự khác biệt duy nhất trong cách tiếp cận này là thay vì thông báoDataSetChanged () bạn sử dụng DiffUtil để cập nhật chế độ xem.
carrizo

bất cứ ý tưởng về tôi? tôi đã thử mọi thứ được liệt kê ở đây nhưng không có may mắn: stackoverflow.com/questions/57332222/ trên

Cảm ơn bạn vì câu trả lời! Bạn có thể vui lòng giải thích lý do tại sao tôi nên đặt "xóa" & "add ALL" sau công vănUpdatesTo ?? Tnx!
Adi Azarya

10

Cập nhật dữ liệu của listview, Gridview và recyclerview

mAdapter.notifyDataSetChanged();

hoặc là

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

Điều này dường như không cập nhật dữ liệu của tôi cho đến khi người dùng bắt đầu cuộn. Tôi đã nhìn khắp nơi và không thể hiểu tại sao ..
SudoPlz 19/03/18

@SudoPlz bạn có thể sử dụng trình nghe cuộn tùy chỉnh để phát hiện cuộn và thực hiện thao tác thông báo của mình như stackoverflow.com/a/31174967/4401692
Pankaj Talaviya 20/03/18

Cảm ơn Pankaj nhưng đó chính xác là những gì tôi đang cố tránh. Tôi muốn cập nhật mọi thứ mà KHÔNG cần người dùng chạm vào màn hình.
SudoPlz

5

Cách tốt nhất và thú vị nhất để thêm dữ liệu mới vào dữ liệu hiện tại là

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

2
Tôi thấy mọi người sử dụng "notifyDataSetChanged" cho MỌI thứ, đó có phải là quá mức không? Ý tôi là, tải lại toàn bộ danh sách vì một vài thay đổi hoặc đã được thêm vào ... Tôi thích cách tiếp cận này, đang triển khai ngay bây giờ, với phương thức "notifyItemRangeInserted".
Vitor Hugo Schwaab

5

Tôi đã giải quyết vấn đề tương tự theo một cách khác. Tôi không có dữ liệu Tôi chờ nó từ luồng nền nên bắt đầu với một danh sách emty.

        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();
        }

Đó là nó.


2

Những phương pháp này là hiệu quả và tốt để bắt đầu sử dụng một cơ bản 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();
}

Bạn có thể triển khai chúng bên trong Lớp Bộ điều hợp hoặc trong Đoạn hoặc Hoạt động của mình nhưng trong trường hợp đó, bạn phải khởi tạo Bộ điều hợp để gọi các phương thức thông báo. Trong trường hợp của tôi, tôi thường thực hiện nó trong Adaptor.


2

Tôi phát hiện ra rằng một cách thực sự đơn giản để tải lại RecyclerView là chỉ cần gọi

recyclerView.removeAllViews();

Điều này trước tiên sẽ xóa tất cả nội dung của RecyclerView và sau đó thêm lại với các giá trị được cập nhật.


2
Xin vui lòng không sử dụng này. Bạn sẽ yêu cầu rắc rối.
dell116

1

tôi đã có câu trả lời sau một thời gian dài

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

0

Nếu không có gì được đề cập trong các ý kiến ​​trên là làm việc cho bạn. Nó có thể có nghĩa là vấn đề nằm ở một nơi khác.

Một nơi tôi tìm thấy giải pháp là theo cách tôi đang thiết lập danh sách cho bộ điều hợp. Trong hoạt động của tôi, danh sách là một biến đối tượng và tôi đã thay đổi nó trực tiếp khi có bất kỳ dữ liệu nào thay đổi. Do nó là một biến tham chiếu nên có điều gì đó kỳ lạ đang xảy ra. Vì vậy, tôi đã thay đổi biến tham chiếu thành một biến cục bộ và sử dụng một biến khác để cập nhật dữ liệu và sau đó chuyển sang addAll()hàm được đề cập trong các câu trả lời ở trên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.