android-fragments 循环视图-迭代器乘以我的项目

m4pnthwp  于 2022-11-14  发布在  Android
关注(0)|答案(3)|浏览(124)

我尝试使用foreach来列出我的项目,它位于我的列表中,名为 checklists,但是它给我带来了一个错误,名为Concurrent Modification。因此,我找到了一个解决方案,如下所示:

//...
    List<Checklist> desc = new ArrayList<>();
            for (Iterator<Checklist> it = checklists.iterator(); it.hasNext(); ) {
                Checklist check = it.next();
                desc.add(new Checklist(check.getDescricao()));
                loadRecycler(desc);
            }
    //...

但现在,我又遇到了另一个问题:每次打开屏幕时,我的项目都被复制。2我该如何解决这个问题呢?3请按照下面的完整代码操作:
检查表片段

public class ChecklistFragment extends Fragment {
    @BindView(R.id.checklist_rcv_itens)
    RecyclerView rvLista;
    @BindView(R.id.checklist_btn_novoitem)
    Button btnAddItem;
    int valor;
    BancoDAO bDAO;
    private Checklist checklist;
    private List<Checklist> checklists;
    private ListChecklistAdapter listChecklistAdapter;

    public ChecklistFragment() {

    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        bDAO = new BancoDAO(getContext());
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_checklist, container, false);
        Log.i("LOG", "onCreate()");
        ButterKnife.bind(this, view);
        checklist = new Checklist();
        checklists = bDAO.listAllItens();

        //It works, but multiply my items
        List<Checklist> desc = new ArrayList<>();
        for (Iterator<Checklist> it = checklists.iterator(); it.hasNext(); ) {
            Checklist check = it.next();
            desc.add(new Checklist(check.getDescricao()));
            loadRecycler(desc);
        }

        /* It works, but multiply my items too
        for (Checklist checklist : new ArrayList<>(checklists)) {
            loadRecycler(checklists);
        } */

        return view;
    }

    private int cont() {
        return valor++;
    }

    //  add 1 item to the list
    @OnClick(R.id.checklist_btn_novoitem)
    void addItem() {
        checklists = new ArrayList<>();
        checklists.add(new Checklist("Teste " + (cont() + 1) + ""));
        bDAO.inserir(new Checklist("Teste " + (cont() + 1) + ""));
        loadRecycler(checklists);
        Helper.snackbarFast(getView(), "Item adicionado");
        return;    
    }

    private void loadRecycler(List<Checklist> lista) {
        if (listChecklistAdapter == null) {
            Log.i("LOG", "IF");

            listChecklistAdapter = new ListChecklistAdapter(getActivity(), lista);

            rvLista.setAdapter(listChecklistAdapter);
            rvLista.setLayoutManager(new LinearLayoutManager(getActivity().getApplicationContext()));
            rvLista.addItemDecoration(new DividerItemDecoration(getActivity(), 1));
            return;
        } else {
            Log.i("LOG", "ELSE");
            listChecklistAdapter.refreshData(lista);
        }
    }
ki1q1bka

ki1q1bka1#

如果你把loadRecycler(desc);这一行从你的循环中删除,就像这样:

List<Checklist> desc = new ArrayList<>();
    for (Iterator<Checklist> it = checklists.iterator(); it.hasNext(); ) {
        Checklist check = it.next();
        desc.add(new Checklist(check.getDescricao()));
    }

    loadRecycler(desc);

看起来您在每次迭代时都添加了列表。

bgtovc5b

bgtovc5b2#

试试这个,注意我把loadRecycler移到了循环外面,如果你想在循环里面做一些更新的话,调用notifyItemChanged(mPos)。

List<Checklist> desc = new ArrayList<>();
    Iterator<Checklist> it = checklists.iterator();
    while (it.hasNext()) {
        Checklist check = it.next();
        desc.add(new Checklist(check.getDescricao()));
    }
    loadRecycler(desc);

另一方面,你必须检查loadRecycler内部的逻辑是什么。问题应该是你如何更新适配器。也许你是在添加项目而不是更新它。

wmvff8tz

wmvff8tz3#

问题已解决我刚将loadRecycler()移出循环:

//   ...
        List<Checklist> desc = new ArrayList<>();
        for (Iterator<Checklist> it = checklists.iterator(); it.hasNext(); ) {
            Checklist check = it.next();
            desc.add(new Checklist(check.getDescricao()));
            loadRecycler(desc);
        }
//   ...

相关问题