Как я могу получить идентификатор push для элемента базы данных Firebase, чтобы отобразить его в listView - PullRequest
0 голосов
/ 27 сентября 2018

Я делаю приложение для работы, действительно мое первое приложение для Firebase.Я успешно реализовал все с помощью одного текстового представления (todo) под UID firebase, создав массив push-идентификатора, который возвращает push-идентификатор при нажатии элемента в представлении списка.

Здесь был мойпредыдущая структура данных:

Старая структура данных

Я застрял с проблемой, что я могу получить идентификаторы push-элементов, чтобы я мог добраться до них и отобразить ихв моем ListView.

Это структура, которую я пытаюсь получить: Новая структура данных

Вот код, который я использую для добавления и удаления данных в старая структура

public void Upload(View v) {
    String userId = myRootRef.push().getKey();
    firebaseUniqueID =mAuth.getCurrentUser().getUid();
    todoToUpload=todoEditText.getText().toString();
    myRootRef.child(firebaseUniqueID).child(userId).setValue(todoToUpload);
    startActivity(new Intent(AddTodo.this,showTodo.class));

Вот код, который я использую для добавления и удаления:

FirebaseAuth mAuth;
FirebaseDatabase mDataBase= FirebaseDatabase.getInstance();
DatabaseReference myRootRef=mDataBase.getReference();
DatabaseReference userRef;
ListView listView;int pos;
private ArrayAdapter<String> adapter;
ArrayList<String> mTodo=new ArrayList<>();
ArrayList<String> keysList = new ArrayList<>();

adapter=new ArrayAdapter<String>(this,R.layout.custom_list_layout,R.id.tood,mTodo);
        listView.setAdapter(adapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            pos=position;

            AlertDialog.Builder mBuilder=new AlertDialog.Builder(showTodo.this);
            View mView=getLayoutInflater().inflate(R.layout.custom_dialog_show,null);
            Todo=mView.findViewById(R.id.todo);
            Delete=mView.findViewById(R.id.delete);
            Done=mView.findViewById(R.id.done);
            closer=mView.findViewById(R.id.dialog_close);
            mBuilder.setView(mView);
            final AlertDialog dailog=mBuilder.create();
            myRootRef.child(firebaseUniqueID).child(keysList.get(position)).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    todoOpened=dataSnapshot.getValue(String.class);
                   Todo.setText(todoOpened);

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

            Delete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(Done.isChecked())
                    {
                        mTodo.remove(pos);
                        adapter.notifyDataSetChanged();
                        //new code below
                        myRootRef.getRoot().child(firebaseUniqueID).child(keysList.get(pos)).removeValue();
                        keysList.remove(pos);
                        dailog.dismiss();


                    }
                }
            });



 myRootRef.child(firebaseUniqueID)
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot firebaseUniqueID : dataSnapshot.getChildren()) {
                        keysList.add(firebaseUniqueID.getKey());
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                    /*handle errors*/
                }
            });



    userRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            String value= dataSnapshot.getValue(String.class);
            mTodo.add(value);
            adapter.notifyDataSetChanged();
        }

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

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

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

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

Вот файл JSON для старой и новой структур

{
  "Z2H2ZkX56fYv3WKxE3a3nCaa8Q63" : {
    "-LNPyZIkX8-uDDGeX-pN" : {
      "Time" : "22:56",
      "Todo" : "play"
    },
    "-LNPze7ppG1L0qFukZO-" : {
      "Priority" : "High",
      "Time" : "22:56",
      "TimeSet" : "09:56",
      "Todo" : "play till the sun goes down"
    },
    "-LNPzhBDDtHv_XSIERX_" : {
      "Priority" : "High",
      "Time" : "22:56",
      "TimeSet" : "09:56",
      "Todo" : "play till the sun goes ddawdawdawdwown"
    }
  }
}

{
  "Z2H2ZkX56fYv3WKxE3a3nCaa8Q63" : {
    "-LNQRCZSsYVPqn0tWghZ" : "play in the evening",
    "-LNQRrLliVSxWBHcEIrv" : "I want to shine like a sun"
  }
}

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Вы можете отобразить список в соответствии с вашей новой структурой, отображаемой в: https://i.stack.imgur.com/E4DXI.png

    FirebaseRecyclerOptions<Messages> options =
            new FirebaseRecyclerOptions.Builder<"Your Class Name">()
                    .setQuery(mMessageThread.child("messages").limitToLast(500), "Your Class Name".class)
                    .setLifecycleOwner(this)
                    .build();

используйте это с адаптером Firebase.

Затем получите текст ToDo и отобразите его.

0 голосов
/ 27 сентября 2018

Вы получаете ключ DataSnapshot, вызывая его getKey() метод.Так, например:

public void onDataChange(DataSnapshot dataSnapshot) {
   todoOpened=dataSnapshot.getValue(String.class);
   String key = dataSnapshot.getKey();
   Todo.setText(key + ": "+ todoOpened);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...