从动态创建的回收器视图中删除随机项目后未获得正确的位置

问题描述 投票:0回答:1

我创建了动态视图的数组列表,其中包含一个微调器和两个编辑文本,通过为其创建模型类动态添加到数组列表中。将视图添加到列表中工作正常。但是,当我尝试从列表中删除随机项目时,会得到不正确的位置。我也用于维持位置,但这会清除现有编辑文本的内容。

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

感谢您提供任何帮助来解决此问题。

java android android-recyclerview dynamic-view
1个回答
0
投票

添加项目时,请确保创建模型类的新实例,而不是使用相同的实例。

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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.