簡體   English   中英

getAdapterPosition() 拋出異常 [android]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM