Обновление ArrayList при изменении данных в Firebase - PullRequest
0 голосов
/ 24 мая 2018

Я использую ArrayList (в Android), который содержит значения из базы данных Firebase.Всякий раз, когда данные добавляются или удаляются, я хочу, чтобы список обновлялся.Для этого я использовал ChildEventListener, но я не уверен, является ли это правильным способом, так как иногда я сталкиваюсь с ошибками при удалении элементов из списка.При добавлении элементов в список проблем нет.Но когда я пытаюсь удалить последний элемент из списка, я получаю ArrayIndexOutOfBounds Exception или другое исключение, например length=12 index=-1.Поэтому, пожалуйста, просмотрите мой код и предложите лучший способ удаления элементов:

    public class Join extends AppCompatActivity {

    DatabaseReference databaseReference;
    ListView listView;
    public static ArrayList<String> keysArrayList; 
    //To store the keys from Firebase
    public static ArrayList<String> namesArrayList; 
    //To store the value or name associated with the key
    ArrayAdapter<String> arrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_join);

    databaseReference = FirebaseDatabase.getInstance().getReference().child(“Queue Codes”);
    listView = (ListView) findViewById(R.id.listViewForMember);
    keysArrayList = new ArrayList<>();
    namesArrayList = new ArrayList<>();
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<> 
    (this,android.R.layout.activity_list_item,namesArrayList);
    listView.setAdapter(arrayAdapter);

    /* Here I am trying to store Random keys from Firebase in 
    ‘keysArrayList’ and their values in ‘namesArrayList’ and update these 
    lists whenever a value is added or removed from the database*/

     databaseReference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            String addedKey = dataSnapshot.getKey();
            String addedName = dataSnapshot.getValue(String.class);
            keysArrayList.add(addedKey);               
            namesArrayList.add(addedName);

            arrayAdapter.notifyDataSetChanged();
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            String removedKey = dataSnapshot.getKey();
            int index = keysArrayList.indexOf(removedKey);
            namesArrayList.remove(index);
            keysArrayList.remove(removedKey);
            arrayAdapter.notifyDataSetChanged();

             /* Here I tried to remove the name from the ‘namesArrayList’ by 
             using the index of removed value from ‘keysArrayList’ as both 
             the lists would be of the same size anytime. I can simply 
             delete the name from the ‘namesArrayList’ by reading the 
             removed value from firebase but gets difficult when I use 
             Custom Array Lists which may contain many other objects. So, I 
             decided to delete the name using key index. */
        }
        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }
        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

1 Ответ

0 голосов
/ 25 мая 2018

Чтобы решить эту проблему, необходимо сначала удалить этот конкретный элемент из адаптера.Если вы не хотите беспокоиться о добавлении или удалении элементов, я рекомендую вам посмотреть мой ответ из этой публикации , в которой я объяснил, как вы можете получать данные из базы данных Firebase Realtime иотобразить его в ListView, используя ArrayAdapter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...