我尝试使用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);
}
}
3条答案
按热度按时间ki1q1bka1#
如果你把
loadRecycler(desc);
这一行从你的循环中删除,就像这样:看起来您在每次迭代时都添加了列表。
bgtovc5b2#
试试这个,注意我把loadRecycler移到了循环外面,如果你想在循环里面做一些更新的话,调用notifyItemChanged(mPos)。
另一方面,你必须检查loadRecycler内部的逻辑是什么。问题应该是你如何更新适配器。也许你是在添加项目而不是更新它。
wmvff8tz3#
问题已解决我刚将loadRecycler()移出循环: