我正在尝试创建向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”
我真的不知道该怎么办:(