Android ListView отвечает своими значениями - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь удалить свою дочернюю базу данных, пока LongItemClick , используя следующий код. Процедура удаления работает нормально. Но когда я пытаюсь долго нажимать его репликацию ListView снова и снова. Я не добавил никакого кода для этого в моем setOnItemLongClickListener. Почему так происходит. Я не смог найти, где это происходит.

 private void showList() {

    Bundle bundle = getIntent().getExtras();
    final String retrievedName = bundle.getString("Name");
    final String retrievedMonth = bundle.getString("Month");

    customerList = findViewById(R.id.customerlistView);
    progress = findViewById(R.id.progress_bar_cust_load);

    progress.setVisibility(View.VISIBLE);

    customerArray.clear();
    customerList.invalidateViews();


    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child(retrievedName);
    DatabaseReference NameRef = ref.child(retrievedMonth);

    NameRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {

                final String name = postSnapshot.getKey();
                customerArray.add(name);
                customerList.setAdapter(new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, customerArray));
                progress.setVisibility(View.INVISIBLE);
            }

            if(customerArray.size()==0){

                progress.setVisibility(View.INVISIBLE);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

            Log.w("name", "load:onCancelled", databaseError.toException());

        }
    });    

customerList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

            progress.setVisibility(View.VISIBLE);

            customerList.invalidateViews();

            final String selectedFromList =(customerList.getItemAtPosition(position).toString());

            Bundle bundle = getIntent().getExtras();
            final String retrievedName = bundle.getString("Name");
            final String retrievedMonth = bundle.getString("Month");

            final DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
            DatabaseReference retrieveStatus = ref.child(retrievedName).child(retrievedMonth).child(selectedFromList).child("status");

            retrieveStatus.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    String status=dataSnapshot.getValue(String.class);

                    String ID= FirebaseAuth.getInstance().getUid();

                    DatabaseReference details_edit=ref.child(retrievedName).child(retrievedMonth).child(selectedFromList).child("status");

                    details_edit.setValue("Dropped");

                    DatabaseReference status_db = FirebaseDatabase.getInstance().getReference().child(ID)
                            .child("Customer Status").child("Dropped").child(selectedFromList);

                    Map statusPost = new HashMap();
                    statusPost.put("name", selectedFromList);

                    status_db.setValue(statusPost);

                    if(!status.equals("Dropped")){

                        assert ID != null;
                        DatabaseReference remove = ref.child(ID).child("Customer Status")
                                .child(status).child(selectedFromList);

                        remove.removeValue();

                    }else {

                    }

                    progress.setVisibility(View.INVISIBLE);
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });


            return true;
        }
    });

}

1 Ответ

0 голосов
/ 24 июня 2018

Хорошо, я думаю, что проблема заключается в следующем:

1) Вы используете событие Value для прослушивания данных (имейте в виду, что этот слушатель очень активен).

2) Затем при долгом нажатии вы обновляете определенное значение в базе данных.

3) Поскольку ValueEventListener очень активен, он отреагирует на изменение и заново заполнит список.

Хорошо, это мой анализ по вашему коду.

Возможное решение:

Попробуйте прослушать один раз при заполнении данных.

Итак, вместо этого в методе (showList ()):

NameRef.addValueEvent......

используйте это:

NameRef.addListenerForSingleValueEvent(.....)

Надеюсь, это поможет решить проблему.

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