当我点击我在回收项目中的关闭按钮时,应用程序会崩溃并抛出错误。我的代码如下:
public void remove(int position) {
asset_type.remove(position);
asset_count.remove(position);
asset_value.remove(position);
AssetDetailsActivity.assetValueId.remove(position);
AssetDetailsActivity.assetCountId.remove(position);
AssetDetailsActivity.assetTypeId.remove(position);
notifyItemRemoved(position);
}
我的错误日志和我在Recycler视图中有两个以上的项目
2019-02-25 11:04:16.733 5036-5036/com.tachyloans E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.tachyloans, PID: 5036
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.remove(ArrayList.java:503)
at com.tachyloans.common.MyAdapter.remove(MyAdapter.java:62)
at com.tachyloans.common.MyAdapter$2.onClick(MyAdapter.java:113)
at android.view.View.performClick(View.java:6310)
at android.view.View$PerformClick.run(View.java:24970)
at android.os.Handler.handleCallback(Handler.java:794)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:6656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
这是因为你试图用List.remove(position)
顺序删除一些项目。您可能正在使用以下代码删除相同的项目位置:
asset_type.remove(position);
asset_count.remove(position);
asset_value.remove(position);
AssetDetailsActivity.assetValueId.remove(position);
AssetDetailsActivity.assetCountId.remove(position);
AssetDetailsActivity.assetTypeId.remove(position);
问题的根源通常是因为您忘记了非原始数据类型总是通过引用传递,例如:a List
。
在下面典型的RecylerView适配器中,List(List<YourDatum> data
)通过引用传递:
public class YourAdapter extends
RecyclerView.Adapter<YourAdapter.ViewHolder> {
..
private List<YourDatum> mData;
public YourAdapter(List<YourDatum> data) {
mData = data;
}
}
并且我们通常通过构造函数传递List:
public class YourActivity extends AppCompatActivity {
ArrayList<YourDatum> mData;
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
// assuming that createInitializeData(10) will create 10 data
mData = createInitializeData(10);
// Now we're passing the data to adapter.
YourAdapter adapter = new YourAdapter(mData);
...
}
}
所以,YourActivity.mData
和YourAdapter.mData
都指向同一个位置。因此,每当您从YourActivity.mData
中移除该项目时,YourAdapter.mData
项目也将被删除。
现在,您只需要为您的案例使用以下代码:
asset_type.remove(position);
asset_count.remove(position);
asset_value.remove(position);
// the following is not needed because it's incorrect
// AssetDetailsActivity.assetValueId.remove(position);
// AssetDetailsActivity.assetCountId.remove(position);
// AssetDetailsActivity.assetTypeId.remove(position)