gpt4 book ai didi

java - getAdapterPosition() 抛出异常 [android]

转载 作者:行者123 更新时间:2023-12-01 19:58:47 24 4
gpt4 key购买 nike

我已尽力理解围绕这一问题的问题。我正在创建一个函数,其中涉及编辑 recyclerview 的内容(项目)。它在编辑一行时工作正常,但在 recyclerview 中编辑另一行时抛出 ArrayIndexOutOfBounds 异常。

此代码是错误的根源。

((ClassListOnSetup) context).editClassnameAt(classes.get(getAdapterPosition()).getId(), getAdapterPosition(), classesBean);

我认为 getAdapterPosition() 方法可能会引发此错误:

以下是 editClassnameAt() 方法以供更多引用:

public void editClassnameAt(long id,int position, String classname ){
demeaSQL.updateAclass(id,classname);

classListOnSetupRecyclerAdapter.notifyItemChanged(position);
classListOnSetupRecyclerAdapter.notifyDataSetChanged();
displayClassList();
}

LogCat 出现错误消息

java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1
at java.util.ArrayList.get(ArrayList.java:413) at com.example.demeainc.demea.ClassListOnSetupRecyclerAdapter$ClassListOnSetupViewHolder$2$2.onClick(ClassListOnSetupRecyclerAdapter.java:87) at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:162)

我哪里错了。有什么帮助吗?

对于那些想查看完整代码的人,
这是我的适配器类完整代码:

public class ClassListOnSetupRecyclerAdapter extends RecyclerView.Adapter<ClassListOnSetupRecyclerAdapter.ClassListOnSetupViewHolder {

//simple list of classes(mDataSet for Adapter)
private List<ClassesBean> listClasses;
private Context mContext;

public class ClassListOnSetupViewHolder extends RecyclerView.ViewHolder {

public TextView textView_classname;
public Button delete_button_classsetup;

public ClassListOnSetupViewHolder(final Context context, View itemView, final List<ClassesBean> classes) {
super(itemView);

textView_classname = itemView.findViewById(R.id.textView_classname);
delete_button_classsetup = itemView.findViewById(R.id.delete_button_classsetup);

delete_button_classsetup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

// if(view.equals(delete_button_classsetup)) {
Log.i("Deletes", "Button pressed");
long id = classes.get(getAdapterPosition()).getId();

((ClassListOnSetup) context).removeAt(getAdapterPosition(), classes.get(getAdapterPosition()).getId());
Toast.makeText(context, "You Clicked ID = " + id, Toast.LENGTH_SHORT).show();
}
});

itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View promptView = inflater.inflate(R.layout.edit_class, null);

AlertDialog.Builder alertDialogueBuilder = new AlertDialog.Builder(mContext);

alertDialogueBuilder.setView(promptView);

final EditText editText = promptView.findViewById(R.id.edittable_className);
editText.setText((listClasses.get(getAdapterPosition()).getClasses_name()));

alertDialogueBuilder.setCancelable(false).setPositiveButton("Update", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialogInterface, int i) {

// long id = classes.get(getAdapterPosition()).getId();

String classesBean = editText.getText().toString();

try {
/**This is as a result of trying to find a solution**/
//long classesArraySize = classes.size();
// while (classes.get(getAdapterPosition()).getId() < classesArraySize)

/**Source of error**/
((ClassListOnSetup) context).editClassnameAt(classes.get(getAdapterPosition()).getId(), getAdapterPosition(), classesBean);
} catch (ArrayIndexOutOfBoundsException exception){
Log.i("Errore", String.valueOf(exception));
}
}
}).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
});

AlertDialog alert = alertDialogueBuilder.create();
alert.show();
}
});
}
}

public ClassListOnSetupRecyclerAdapter(Context context, List<ClassesBean> classes){

mContext = context;
listClasses = classes;
}

@Override
public ClassListOnSetupRecyclerAdapter.ClassListOnSetupViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_classesname_recycler,parent,false);

return new ClassListOnSetupViewHolder(mContext,itemView,listClasses);
}

@Override
public void onBindViewHolder(ClassListOnSetupViewHolder holder, final int position) {

holder.textView_classname.setText(listClasses.get(position).getClasses_name());
}

@Override
public int getItemCount() {
Log.v(ClassListOnSetupRecyclerAdapter.class.getSimpleName(),"ListClasses"+listClasses.size());
return listClasses.size();
}
}

我的 JavaBean 类名为 ClassesBean

public class ClassesBean {

private Long id;
private int classes_item_index;
private String classes_name;
private String classes_codename;
private String classes_sections;
private String classes_teachers;
private String classes_students;

public int getClasses_item_index() {

return classes_item_index;
}

public void setClasses_item_index(int classes_item_index) {
this.classes_item_index = classes_item_index;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getClasses_name() {

return classes_name;
}

public void setClasses_name(String classes_name) {
this.classes_name = classes_name;
}

public String getClasses_codename() {
return classes_codename;
}

public void setClasses_codename(String classes_codename) {
this.classes_codename = classes_codename;
}

public String getClasses_sections() {
return classes_sections;
}

public void setClasses_sections(String classes_sections) {
this.classes_sections = classes_sections;
}

public String getClasses_teachers() {
return classes_teachers;
}

public void setClasses_teachers(String classes_teachers) {
this.classes_teachers = classes_teachers;
}

public String getClasses_students() {
return classes_students;
}

public void setClasses_students(String classes_students) {
this.classes_students = classes_students;
}



}

最佳答案

我最初的回答指出,您应该在 onBindViewHolder() 中添加监听器。这可行,但不是最佳解决方案,因为每次调用 onBindViewHolder() 时都会创建新的监听器对象。

在构造函数中添加监听器是正确的,但是 getAdapterPosition() 可以 sometimes返回 -1 (RecyclerView.NO_POSITION)。

解决方案是检查 getAdapterPosition() == RecyclerView.NO_POSITION 是否为 true,如果为 true,则忽略该调用。

 public ClassListOnSetupViewHolder(final Context context, View itemView, final List<ClassesBean> classes) {

super(itemView);

delete_button_classsetup = itemView.findViewById(R.id.delete_button_classsetup);

delete_button_classsetup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

int adapterPosition = getAdapterPosition();
if (adapterPosition == RecyclerView.NO_POSITION) {
return;
}

Log.i("Deletes", "Button pressed");
long id = classes.get(adapterPosition).getId();

((ClassListOnSetup) context).removeAt(adapterPosition, classes.get(adapterPosition).getId());
Toast.makeText(context, "You Clicked ID = " + id, Toast.LENGTH_SHORT).show();
}
});

// ...
}

关于java - getAdapterPosition() 抛出异常 [android],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48653685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com