首页 > 解决方案 > 为什么我的 RecyclerViewAdapter 弄乱了元素的索引?

问题描述

我正在尝试创建向 RecyclerViewAdapter 添加元素的功能。一切似乎都在工作,但在某些时候发生了一件奇怪的事情:从索引 2 开始,RVA 在 RecyclerView 的开头添加了新元素。为什么会这样?

我尝试在 arrayList.add(index, element) 的帮助下在某些索引处添加元素,但这并不成功。

AddBigTaskFragment.class

public class AddBigTaskFragment extends Fragment  {
...
private RecyclerView recyclerView;
private RVABigTask adapter;
private ArrayList<SubTask> arrayList;
...
public AddBigTaskFragment() {
}

...

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_add_big_task, container, false);

    ...

    adapter = new RVABigTask(getContext());
    adapter.setListener(this);

    recyclerView.setAdapter(adapter);

    close_btn.setOnClickListener(v -> getFragmentManager().popBackStack());

    rl_add.setOnClickListener(v -> adapter.addToRV()); //Adding the element to adapter

public void refreshAdapterOnAdd(int position) {        
    adapter.notifyDataSetChanged();
}

public void refreshAdapterOnDelete(int position) {
    adapter.notifyItemRemoved(position);
}
}

RVABigTask.class

public class RVABigTask extends RecyclerView.Adapter<RVABigTask.ViewHolder>{

private Context context;
...
private ArrayList<SubTask> arrayList;
private AddBigTaskFragment fragment;
private DataManager dataManager;
private int index = 0;

public RVABigTask(Context context ) {
    this.context = context;
    this.iAdapterRefresher = iAdapterRefresher;
    arrayList = new ArrayList<>();
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false);
    RVABigTask.ViewHolder vh = new RVABigTask.ViewHolder(v);
    dataManager = new DataManager(context, null);
    return vh;
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

    SubTask item = arrayList.get(holder.getAdapterPosition());

    if (arrayList.size() > 0) {
        fragment.save_btn.setVisibility(View.VISIBLE);
    } else if (arrayList.size() <= 0) {
        fragment.save_btn.setVisibility(View.GONE);
    }

    if (holder.recycler_edittext.getText().toString().trim().length() == 0)
    {
        holder.recycler_edittext.requestFocus();
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
    }

...

    holder.delete_btn.setOnClickListener(v -> removeAt(position, item));
}

public void addToRV() {
    SubTask subTask = new SubTask();
    arrayList.add(subTask);
    refreshItems(arrayList);
    index++;
}

@Override
public int getItemCount() {
    if (arrayList.size() != 0) {
        return arrayList.size();
    } else {
        return 0;
    }
}

public ArrayList<SubTask> getArrayList() {
    return arrayList;
}

public void setListener(AddBigTaskFragment fragment) {
    this.fragment = fragment;
}

public void removeAt(int position, SubTask subTask) {
    arrayList.remove(position);
//arrayList.remove(subTask);
    fragment.refreshAdapterOnDelete(position);
}

public void setSubTasksReference(String reference) {
    for (SubTask subTask : arrayList) {
        subTask.setReference(reference);
        dataManager.addSubTask(subTask);
    }
}

private void refreshItems(ArrayList<SubTask> array) {
    ArrayList<SubTask> secondary = new ArrayList<>();
    secondary.addAll(array);
    arrayList.clear();
    arrayList.addAll(secondary);
    fragment.refreshAdapterOnAdd(index);
}

public class ViewHolder extends RecyclerView.ViewHolder {

    public EditText recycler_edittext;
    public ImageButton delete_btn;
    public CheckBox checkBox;

    public ViewHolder(View itemView) {
        super(itemView);
        recycler_edittext = itemView.findViewById(R.id.recycler_item_edittext);
        delete_btn = itemView.findViewById(R.id.delete_item_recycler);
        checkBox = itemView.findViewById(R.id.checkbox_recycler);
    }
}
}

我希望 RecyclerView 像“1 - 2 - 3”,但我得到了:1)添加 1 个元素,一切正常 2)添加 2 个元素,仍然可以,回收器看起来像这样:“1 - 2”3)添加3 元素,顺序混乱:“3 - 1 - 2”

我真的不知道该怎么办:(

标签: javaandroidandroid-recyclerview

解决方案


推荐阅读