![](/img/trans.png)
[英]Android getAdapterPosition returns always getItemCount
[英]getAdapterPosition() throws an Exception [android]
我已尽力了解围绕这个单一问题的问题。 我正在创建一个涉及编辑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; 指数=-1
在 java.util.ArrayList.get(ArrayList.java:413) 在 com.example.demeainc.demea.ClassListOnSetupRecyclerAdapter$ClassListOnSetupViewHolder$2$2.onClick(ClassListOnSetupRecyclerAdapter.java:87) 在 android.support.v7.app.AlertController$ButtonHandler .handleMessage(AlertController.java:162)
我怎么了。 请问有什么帮助吗?
对于那些想要查看完整代码的人,
这是我的 Adapter 类的完整代码:
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()
时onBindViewHolder()
创建新的侦听器对象。
在构造函数中添加侦听器是正确的,但是getAdapterPosition()
有时会返回 -1 ( RecyclerView.NO_POSITION
)。
解决方案是检查getAdapterPosition() == RecyclerView.NO_POSITION
是否为真,并忽略调用。
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();
}
});
// ...
}
getAdapterPosition() 返回-1,表示Adapter 得到NO_POSITION,调用notifyDataSetChanged() 时总会发生。所以,可以编辑getAdapterPosition() 的日志。同时,请确保getAdapterPosition() ! = -1 或 getAdapterPosition() 在调用 list.get(index) 之前在列表的索引中。顺便说一下,我们总是在 onBindViewHolder() 中设置单击侦听器,而不是在 ViewHolder 的构造函数中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.