我有一个回收视图充满了项目,当你长按一行,删除按钮出现,允许用户删除行-我设法让工作正常,但我然后想添加一点安全,它通过添加询问用户是否要删除该行的对话框。然而,当我在对话框中调用该方法时,我会得到一个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);
}
我使用了系统。取出
行以确保位置正确。
有人能帮我理解为什么当我从对话框调用方法时,列表是空的,但是如果我在我的主要活动中调用它,列表就不是空的。有办法解决这个问题吗?提前感谢。
编辑:从对话框调用方法时,MyallStock
ArrayList为空。以下是获取ArrayList的方法:
private DBHandlerStock db;
private ArrayList<Stock> allStock = new ArrayList<>();
db = new DBHandlerStock(this);
allStock = db.getAllStock();
我通过使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驱动程