首页 > 解决方案 > 来自 Firebase 的微调器值,在新数据上添加微调器项

问题描述

我已经使用 Spinner 和 Firebase 实时数据库读取完成了我的项目。在新添加值时,微调器不会删除旧值,怎么办?

这里预览 https://photos.app.goo.gl/jYTyJvcDpqBeGDTg9

“POS”是我在我的数据库中添加的新项目,这里是预览https://photos.app.goo.gl/mH14qQ54ra3ULBZH8

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

    spinner = (Spinner) findViewById(R.id.tujuan_spinner);

    databaseReference = FirebaseDatabase.getInstance().getReference("Spinner_Tujuan");

    spinnerDataList = new ArrayList<>();
    adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, spinnerDataList);

    spinner.setAdapter(adapter);
    retrieveData();

当我添加新值时,微调器仍然保留旧值,它成为重复值。插入新值时如何删除旧值?

    //HERE
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, final int i, long l) {
            spinner.setSelection(i);
            final String value =spinner.getSelectedItem().toString();

            if (value.equals("SILA PILIH")){
                //DO nothing

            }if (value.equals("Pegawai")){
                bukasenaraiPegawai();
            } else {
                admin.setValue(value);
                openDialogInfo();
                spinner.setSelection(0);
            }

        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    });
}

public void retrieveData(){
    listener = databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot item : dataSnapshot.getChildren()){
                spinnerDataList.add(item.getValue().toString());
            }
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}
}

标签: androidfirebase-realtime-database

解决方案


每次onDataChange调用您的方法时, 都会dataSnapshot包含所有数据的快照databaseReference。因此,您需要从 中清除现有数据spinnerDataList以防止重复:

listener = databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        spinnerDataList.clear();
        for (DataSnapshot item : dataSnapshot.getChildren()){
            spinnerDataList.add(item.getValue().toString());
        }
        adapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // don't ignore errors
    }
});

推荐阅读