Używam firebase z widokiem na recykling, a kiedy usuwam element za pomocą przycisku, usuwa go on w bazie danych Firebase, ale podwaja dane w widoku recyklingu.

Kod do wyświetlania danych:

public class testextends AppCompatActivity {
    EditText Name;
    Button Button;
    private List<Task> allTask;
    private LinearLayoutManager linearLayoutManager;
    private RecyclerViewAdapter recyclerViewAdapter;
    private RecyclerView recyclerView;

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

        recyclerView = (RecyclerView)findViewById(R.id.task_list);
        linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        allTask = new ArrayList<Task>();

        test= findViewById(R.id.test);
        but= (Button) findViewById(R.id.btn);
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("test");

       reference .addValueEventListener (new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                getAllTask(dataSnapshot);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            }

        });

       }

    private void getAllTask(DataSnapshot dataSnapshot){
        for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
            String taskTitle = (String) singleSnapshot.child("test").getValue();

            allTask.add(new Task(taskTitle));
            recyclerViewAdapter = new RecyclerViewAdapter(BusinessManageCounters.this, allTask);
            recyclerView.setAdapter(recyclerViewAdapter);
        }
    }

    private void taskDeletion(DataSnapshot dataSnapshot){
        for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
            String taskTitle = (String) singleSnapshot.child("test").getValue();
            for(int i = 0; i < allTask.size(); i++){
                if(allTask.get(i).getTask().equals(taskTitle)){
                    allTask.remove(i);
                }
            }

            recyclerViewAdapter.notifyDataSetChanged();
            recyclerViewAdapter = new RecyclerViewAdapter(BusinessManageCounters.this, allTask);
            recyclerView.setAdapter(recyclerViewAdapter);
        }
    }

Daj mi znać, jeśli potrzebujesz innego kodu, aby pomóc.

0
user13173955 31 marzec 2020, 22:03

3 odpowiedzi

Najlepsza odpowiedź

Za każdym razem, gdy zmieniają się dane i następuje wywołanie zwrotne zdarzenia, dodajesz całą listę do allTask. Ale zapomniałeś usunąć stare obiekty z listy:

Dodaj jedną linię w tej metodzie i sprawdź: allTask.clear();

private void getAllTask(DataSnapshot dataSnapshot){

    allTask.clear();
    for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
        String taskTitle = (String) singleSnapshot.child("counterName").getValue();
        if(taskTitle != null){
        allTask.add(new Task(taskTitle));
        recyclerViewAdapter = new RecyclerViewAdapter(BusinessManageCounters.this, allTask);
        recyclerView.setAdapter(recyclerViewAdapter);
    }}
}

Musisz także przesunąć następujące dwie linie z pętli for:

        recyclerViewAdapter = new RecyclerViewAdapter(BusinessManageCounters.this, allTask);
        recyclerView.setAdapter(recyclerViewAdapter);

I zrób:

private void getAllTask(DataSnapshot dataSnapshot){
        allTask.clear();
        for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
            String taskTitle = (String) singleSnapshot.child("counterName").getValue();
            if(taskTitle != null){
            allTask.add(new Task(taskTitle));
        }}
        recyclerViewAdapter = new RecyclerViewAdapter(BusinessManageCounters.this, allTask);
        recyclerView.setAdapter(recyclerViewAdapter);
    }
1
Nilesh B 31 marzec 2020, 19:41

Oprócz poprzedniej odpowiedzi chcę polecić użycie ListAdapter zamiast RecyclerViewAdapter

-1
Mykhailo Krentsin 31 marzec 2020, 19:26

To dlatego, że masz kod usuwania w metodzie onCreate (), więc musisz dokonać zmiany konfiguracji (tj. zmienić obrót urządzenia) lub zabić aplikację z ekranu ostatnich i otworzyć ją ponownie, aby zauważyć, że dane zostały usunięte, Ogólnie o czym tutaj robisz wprowadzenie logiki biznesowej do działania jest bardzo złą praktyką, masz wiele innych opcji, które rozwiążą Twój problem i sprawią, że kod będzie czystszy, jedna z nich:

-utwórz model widoku i przenieś do niego logikę, a następnie ustaw swoją listę jako obiekt LiveData, aby była świadoma cyklu życia i natychmiast zaktualizuj interfejs użytkownika

0
MR3YY 31 marzec 2020, 19:13