我创建了动态视图的数组列表,其中包含一个微调器和两个编辑文本,通过为其创建模型类动态添加到数组列表中。将视图添加到列表中工作正常。但是,当我尝试从列表中删除随机项目时,会得到不正确的位置。我也用于维持位置,但这会清除现有编辑文本的内容。
notifyItemRangeChanged(position, journalEntryModelsList.size())
还注意到开始工作。
notifyDataSetChanged();
notifyItemChanged(position,journalEntryModelsList.get(position));
将动态视图添加到回收器视图数组列表的代码
ArrayList<JournalEntryModel> journalEntryModelsList = new ArrayList<>();
GeneralEntryAdapter adapter = new GeneralEntryAdapter(journalEntryModelsList,this,accountList);
binding.recyclerviewaddnewentry.setAdapter(adapter);
JournalEntryModel entryModel = new JournalEntryModel(spinnerAccountType, edtDebit,edtCredit);
binding.btnAddLine.setOnClickListener(v -> {
journalEntryModelsList.add(entryModel);
adapter.notifyItemInserted(journalEntryModelsList.size() - 1);
});
这是我的适配器代码
public class GeneralEntryAdapter extends RecyclerView.Adapter<GeneralEntryAdapter.GeneralEntryViewHolder> {
ArrayList<JournalEntryModel> journalEntryModelsList;
Context context;
ArrayList<String> accountList;
public GeneralEntryAdapter(ArrayList<JournalEntryModel> journalEntryModelsList, Context context, ArrayList<String> accountList) {
this.journalEntryModelsList = journalEntryModelsList;
this.context = context;
this.accountList = accountList;
}
@NonNull
@Override
public GeneralEntryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.row_layaddnewentry, parent, false);
return new GeneralEntryViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull GeneralEntryViewHolder holder, int position) {
ArrayAdapter spinnerArrayAdapter = new ArrayAdapter<>(context, android.R.layout.simple_spinner_item,accountList);
spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
holder.spinnerAccountType.setAdapter(spinnerArrayAdapter);
//set default debit, credit to empty
holder.edtDebit.setText("");
holder.edtCredit.setText("");
Log.e("TAG", "onBindViewHolder: call again" );
holder.imgClose.setOnClickListener(view -> {
removeRow(position);
});
}
public void removeRow(int position){
Log.e("TAG", "removeRow: position = "+position );
Log.e("TAG", "removeRow: array size = "+journalEntryModelsList.size() );
if (position >= journalEntryModelsList.size() || position < 0 ){
}else{
journalEntryModelsList.remove(journalEntryModelsList.get(position));
notifyItemRemoved(position);
}
/*if (journalEntryModelsList.size() > 0 ){
journalEntryModelsList.remove(journalEntryModelsList.get(position));
notifyItemRemoved(position);
//notifyItemRangeChanged(position, journalEntryModelsList.size());
}*/
}
@Override
public int getItemCount() {
return journalEntryModelsList.size();
}
public class GeneralEntryViewHolder extends RecyclerView.ViewHolder {
public EditText edtDebit, edtCredit;
public Spinner spinnerAccountType;
public ImageView imgClose;
public GeneralEntryViewHolder(@NonNull View itemView) {
super(itemView);
edtDebit = itemView.findViewById(R.id.edtDebit);
edtCredit = itemView.findViewById(R.id.edtCredit);
spinnerAccountType = itemView.findViewById(R.id.spinnerAccountType);
imgClose = itemView.findViewById(R.id.img_close);
}
}}
感谢您提供任何帮助来解决此问题。
添加项目时,请确保创建模型类的新实例,而不是使用相同的实例。
binding.btnAddLine.setOnClickListener(v -> {
JournalEntryModel entryModel = new JournalEntryModel(spinnerAccountType, edtDebit, edtCredit);
journalEntryModelsList.add(entryModel);
adapter.notifyItemInserted(journalEntryModelsList.size() - 1);
});
此外,在您的removeRow()方法中,您应该直接从列表中删除该项目,然后您应该通知适配器有关删除的信息。而且,您不需要在 if-else 条件内调用 notificationItemRemoved()。
public void removeRow(int position) {
if (position >= 0 && position < journalEntryModelsList.size()) {
journalEntryModelsList.remove(position);
notifyItemRemoved(position);
}
}