Не удалось обновить утилиту - PullRequest
0 голосов
/ 31 марта 2020

Я использую Firebase с представлением реселлера, и когда я удаляю элемент с помощью кнопки, он удаляется в базе данных Firebase, но удваивает данные в представлении реселлера.

код для отображения данных:

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

Пожалуйста, дайте мне знать, нужен ли какой-либо другой код, чтобы помочь.

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Всякий раз, когда происходит изменение ваших данных и обратный вызов события, вы добавляете весь список в allTask. Но вы забыли удалить старые объекты из списка:

добавьте одну строку в этом методе и проверьте: 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);
    }}
}

Вы также должны переместить следующие две строки из для l oop:

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

и сделать:

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);
    }
0 голосов
/ 31 марта 2020

В дополнение к предыдущему ответу я хочу порекомендовать вам использовать ListAdapter вместо RecyclerViewAdapter

0 голосов
/ 31 марта 2020

это потому, что у вас есть код удаления в методе onCreate (), поэтому вам нужно внести изменения в конфигурацию (например, изменить ротацию устройства) или убить приложение из экрана последних и открыть его снова, чтобы заметить, что данные удалены. Делать бизнес-логи c в действии - очень плохая практика, у вас есть много других вариантов, которые решат вашу проблему и сделают ваш код чище, один из них:

- создайте модель представления и переместите логику c к нему, затем сделайте свой список объектом LiveData, чтобы он стал осведомленным о жизненном цикле, и немедленно обновите пользовательский интерфейс

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