当前位置: 首页 > 知识库问答 >
问题:

为什么从对话框调用活动方法时会出现IndexOutOfBoundsException错误?[副本]

郑俊美
2023-03-14

我有一个回收视图充满了项目,当你长按一行,删除按钮出现,允许用户删除行-我设法让工作正常,但我然后想添加一点安全,它通过添加询问用户是否要删除该行的对话框。然而,当我在对话框中调用该方法时,我会得到一个IndexOutOfBoundsExc0019,如下所示:

2021-10-19 15:52:06.774 16238-16238/com.example.it_stock E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.it_stock, PID: 16238
    java.lang.IndexOutOfBoundsException: Index: 6, Size: 0
        at java.util.ArrayList.get(ArrayList.java:411)
        at com.example.it_stock.MainActivity.deleteItemRow(MainActivity.java:93)
        at com.example.it_stock.ConfirmDeleteDialog.lambda$yes$1$ConfirmDeleteDialog(ConfirmDeleteDialog.java:48)
        at com.example.it_stock.-$$Lambda$ConfirmDeleteDialog$VgpDlH3zTD1jVLwQl8Gp5RaCjYw.onClick(lambda)
        at android.view.View.performClick(View.java:5637)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
        at android.view.View$PerformClick.run(View.java:22433)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6121)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

我正在使用一个界面长按回收器视图行:

package com.example.it_stock;

public interface StockViewInterface {
    void onItemClick(int position);
    void onLongItemClick(int position);
}

这在我的适配器中:

// Uses the StockViewInterface to implement click listeners. These can then be used in Main Activity.
            stockView.setOnClickListener(v -> {
                stockViewInterface.onItemClick(getAdapterPosition());
                notifyItemChanged(selectedPosition);
                selectedPosition = RecyclerView.NO_POSITION;
                notifyItemChanged(selectedPosition);
            });

            stockView.setOnLongClickListener(v -> {
                stockViewInterface.onLongItemClick(getAdapterPosition());
                // Highlight row
                notifyItemChanged(selectedPosition);
                selectedPosition = getAdapterPosition();
                notifyItemChanged(selectedPosition);
                return true; // doesn't allow multiple rows to be selected. False would highlight multiple rows but the remove method only allows one deletion at a time for now.
            });

这些是我主要活动中的长单击和删除行方法:

    // Long tap on a row in the Recycler View. Remove button becomes visible and once clicked opens the confirmation dialog.
    @Override
    public void onLongItemClick(int position) {
        btnRemoveItem.setVisibility(View.VISIBLE);
        btnRemoveItem.setOnClickListener(v -> {
            ConfirmDeleteDialog confirmDeleteDialog = new ConfirmDeleteDialog();
            Bundle bundle = new Bundle();
            bundle.putInt("position", position);
            confirmDeleteDialog.setArguments(bundle);
            confirmDeleteDialog.show((MainActivity.this).getSupportFragmentManager(),"confirm");
        });
        System.out.println(position);
    }

    // Deletes row.
    public void deleteItemRow(int position) {
        String stock = allStock.get(position).getItem();
        db.deleteStockItem(db.getStockItem(allStock.get(position).getID()));
        allStock.remove(position);
        stockAdapter.notifyItemRemoved(position);
        stockAdapter.notifyDataSetChanged();
        btnRemoveItem.setVisibility(View.INVISIBLE);
        stockAdapter.selectedPosition = RecyclerView.NO_POSITION;
        Toast.makeText(this, stock + " successfully deleted!", Toast.LENGTH_SHORT).show();
    }

当我从是()方法中的对话框中调用该方法时,该问题发生在deleteItemRow()方法中:

public class ConfirmDeleteDialog extends DialogFragment {
    private MainActivity mainActivity;
    public static final String TAG = "confirm";
    int position;
    Button no, yes;

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        LayoutInflater inflater = getActivity().getLayoutInflater();
        View v = inflater.inflate(R.layout.dialog_confirm_delete, null);
        Bundle bundle = getArguments();
        position = bundle.getInt("position", position);
        no = v.findViewById(R.id.btnNo);
        yes = v.findViewById(R.id.btnYes);
        mainActivity = new MainActivity();
        System.out.println(position);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setView(v);
        no();
        yes();
        return builder.create();
    }

    private void no() {
        no.setOnClickListener(v -> {
            dismiss();
        });
    }

    private void yes() {
        yes.setOnClickListener(v -> {
            mainActivity.deleteItemRow(position);
            System.out.println(position);
            dismiss();
        });
    }
}

如开头所述,如果我在“删除项目”按钮上调用deleteItemRow(),则它可以正常工作。如果我这样做,请按:

@Override
    public void onLongItemClick(int position) {
        btnRemoveItem.setVisibility(View.VISIBLE);
        btnRemoveItem.setOnClickListener(v -> {
            deleteItemRow(position);
            
        });
        System.out.println(position);
    }

我使用了系统。取出行以确保位置正确。

有人能帮我理解为什么当我从对话框调用方法时,列表是空的,但是如果我在我的主要活动中调用它,列表就不是空的。有办法解决这个问题吗?提前感谢。

编辑:从对话框调用方法时,MyallStockArrayList为空。以下是获取ArrayList的方法:

private DBHandlerStock db;
private ArrayList<Stock> allStock = new ArrayList<>();

db = new DBHandlerStock(this);
allStock = db.getAllStock();

共有1个答案

卞云瀚
2023-03-14

我通过使DBHandler、ArrayList、适配器和按钮保持静态来“修复”这个问题。然而,这会造成内存泄漏,所以我将找到另一种解决方法。谢谢你的回复。

编辑:我只需要更改mainActivity=newmainActivity() mainActivity=((mainActivity)getActivity()) 在我的对话框中。arrayList为空,因为每次打开对话框时它都在创建新的mainActivity。

 类似资料:
  • 错误:第 1 行的解析错误:函数搜索(sour ^ 期望“字符串”、“数字”、“空”、“真”、“假”、“{”、“[”,得到“未定义” 代码:

  • 我试图在循环中初始化数组C,但它给出了错误: C是类ipdata的数组,我已经声明了它,并试图在循环中初始化它。 有什么问题吗?它表示:无法访问cluster_anlysis类型的封闭实例。必须使用cluster_anlysis类型的封闭实例限定分配(例如,x.new A(),其中x是cluster_anlysis的实例)。

  • 我实现了以下REST调用: 也是一个提供和使用application/x-protobuf的提供者类: 我的pom。xml看起来像: 我的小部件。原型: 选项java_package=“example”;选项java\u outer\u classname=“WidgetsProtoc”; 对于http://localhost:8080/RESTfulExample/widgets我得到以下错误消

  • 问题内容: 我已经阅读了 为什么在尝试在数据库中加载Blob时会出现java.lang.AbstractMethodError?,下载了我能找到的所有11g jdbc驱动程序,并将它们作为库和/或jar文件添加到了我的NetBeans应用程序中。我仍然不断收到相同的AbstractMethodError,这让我很生气!任何指导将不胜感激! 错误信息: 问题答案: 问题的原因是软件不兼容(jar文件

  • 我花了三天的时间来寻找答案,看视频和论坛帖子,但没有运气。请看这四张照片。它似乎只在问题有图像文件时才这样做。

  • 我正在用IntelliJ IDEA Ultimate制作一个Java web项目。我有一个类,它有一个方法,该方法接受两个字符串作为输入,查询数据库,并返回一个int值。(这是一个登录方法——接收用户名和密码——如果它们有效,它应该返回用户名的int,否则为0)。 我通过用main方法从Tester类中调用它来测试这个方法,它返回了预期值。然而,当从jsp页面调用这个方法时,它会给我的SQL驱动程