Android 使用arrayList.remove(位置)时,应用程序崩溃

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

我正在使用geofire填充我的recyclerview,在键盘输入时工作正常,但当onKeyExited调用我的应用程序崩溃时,请帮助我,这是我的代码

 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);
                }
            }
        }