Android 使用arrayList.remove(位置)时,应用程序崩溃
我正在使用geofire填充我的recyclerview,在键盘输入时工作正常,但当onKeyExited调用我的应用程序崩溃时,请帮助我,这是我的代码Android 使用arrayList.remove(位置)时,应用程序崩溃,android,android-studio,Android,Android Studio,我正在使用geofire填充我的recyclerview,在键盘输入时工作正常,但当onKeyExited调用我的应用程序崩溃时,请帮助我,这是我的代码 private void Geofireinit() { started = true; GeoQuery geoQuery = fire.queryAtLocation(new GeoLocation(20.887715, 77.757623), 50); geoQuery.addGeoQueryEventListe
private void Geofireinit() {
started = true;
GeoQuery geoQuery = fire.queryAtLocation(new GeoLocation(20.887715, 77.757623), 50);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
Log.e("id", key);
Location to = new Location("to");
to.setLatitude(location.latitude);
to.setLongitude(location.longitude);
if (!fetchedUserIds) {
userIdsToLocations.put(key, to);
} else {
userIdsToLocations.put(key, to);
addUserListener(key);
}
}
@Override
public void onKeyExited(String key) {
Log.d("TAG", "onKeyExited: ");
if (userIdsWithListeners.contains(key)) {
int position = getUserPosition(key);
arrayList.remove(position);
adapter.notifyItemRemoved(position);
}
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
}
@Override
public void onGeoQueryReady() {
initialListSize = userIdsToLocations.size();
if (initialListSize == 0) {
fetchedUserIds = true;
}
iterationCount = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
userIdsToLocations.keySet().forEach(this::addUserListener);
}
}
private void addUserListener(String key) {
databaseReference = FirebaseDatabase.getInstance().getReference().child("buses").child(key);
databaseReference.addValueEventListener(userValueListener);
userIdsWithListeners.add(key);
}
@Override
public void onGeoQueryError(DatabaseError error) {
}
});
geoQueries.add(geoQuery);
}
private void setuplist() {
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new Adapter(this, arrayList);
recyclerView.setAdapter(adapter);
}
private void setupFirebase() {
databaseReference = FirebaseDatabase.getInstance().getReference().child(("tracker"));
fire = new GeoFire(databaseReference);
getrecyclerview();
}
private void getrecyclerview() {
userValueListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Mylist mylist = dataSnapshot.getValue(Mylist.class);
mylist.setTextView(dataSnapshot.child("text").getValue().toString());
if (arrayList.contains(mylist)) {
update(mylist);
} else {
newdata(mylist);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
}
private void newdata(Mylist mylist) { // for new data inserted
iterationCount++;
arrayList.add(0, mylist);
if (!fetchedUserIds && iterationCount == initialListSize) {
fetchedUserIds = true;
adapter.setUsers(arrayList);
} else if (fetchedUserIds) {
adapter.notifyItemInserted(getIndexOfNewUser(mylist));
}
}
private void update(Mylist mylist) {
int position = getUserPosition(mylist.getTextView());
arrayList.set(position, mylist);
adapter.notifyItemChanged(position);
}
private int getUserPosition(String id) {
for (int i = 0; i < arrayList.size(); i++) {
if (arrayList.get(i).getTextView().equals(id)) {
Log.d("LOG_TAG", "getIndexOfNewUser: " + i);
return i;
}
}
return -1;
}
private int getIndexOfNewUser(Mylist u) {
for (int i = 0; i < arrayList.size(); i++) {
if (arrayList.get(i).getTextView().equals(u.getTextView())) {
Log.d("index", "getIndexOfNewUser: " + i);
return i;
}
}
throw new RuntimeException();
}
private void removeListeners() {
for (GeoQuery geoQuery : geoQueries) {
geoQuery.removeAllListeners();
}
for (String userId : userIdsWithListeners) {
databaseReference =
FirebaseDatabase.getInstance().getReference().child("buses").child(userId);
databaseReference.removeEventListener(userValueListener);
}
}
方法getUserPositionString id可以返回-1,但数组不可能有-1位置。那么你应该在这里检查一下:
public void onKeyExited(String key) {
Log.d("TAG", "onKeyExited: ");
if (userIdsWithListeners.contains(key)) {
int position = getUserPosition(key);
if (position!=-1){
arrayList.remove(position);
adapter.notifyItemRemoved(position);
}
}
}
主席先生,这是工作正常,但当位置被删除的重复数据被添加到recyclerview。adapter.notifyItemRemovedposition;这一行是我在发布后添加的=-1对于notifyitemRemoved,数据已成功删除,但之后添加了重复数据请检查此链接。此问题与我建议的问题无关。您可以尝试将adapter.notifyItemRemovedposition更改为adapter.notifyDataSetChanged。这很好。当我使用adapter.notifyDataSetChanged时;recyclerview未更新live我必须重新打开,然后在OnKeyExited中删除数据您可以添加recyclerview的适配器和持有者类代码吗?好的。快速解决方案-更换此:如果位置=-1{arrayList.removeposition;adapter.notifyDataSetChanged;}
2020-06-11 14:46:21.752 16559-16559/com.pranay.test2 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.pranay.test2, PID: 16559
java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1
at java.util.ArrayList.remove(ArrayList.java:506)
at com.pranay.test2.MainActivity$4.onKeyExited(MainActivity.java:208)
at com.firebase.geofire.EventListenerBridge.onDataExited(EventListenerBridge.java:52)
at com.firebase.geofire.GeoQuery$4.run(GeoQuery.java:162)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:232)
at android.app.ActivityThread.main(ActivityThread.java:7172)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:576)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888)
public void onKeyExited(String key) {
Log.d("TAG", "onKeyExited: ");
if (userIdsWithListeners.contains(key)) {
int position = getUserPosition(key);
if (position!=-1){
arrayList.remove(position);
adapter.notifyItemRemoved(position);
}
}
}