Извлечение ключа Firebase из onItemClick в FirebaseListAdapter

#android #listview #firebase #firebase-realtime-database

#Android #firebase #firebase-база данных в реальном времени #firebaseui

Вопрос:

У меня есть база данных Firebase, которую я push() использую для добавления записей в базу данных, генерируя таким образом случайный ключ в качестве ссылки для каждой записи.

В части приложения я использую FirebaseListAdapter для заполнения некоторых записей базы данных в виде списка. Затем я реализую setOnItemClickListener свой список. Что я хочу здесь сделать, так это вернуть ссылку для каждой записи, на которую я нажимаю.

     //Firebase DB setup
    mDatabaseStolen =       FirebaseDatabase.getInstance().getReference().child(testing);

    myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            DatabaseReference itemRef = mDatabaseStolen.getRef();

            Toast toast = Toast.makeText(getActivity().getApplicationContext(), itemRef.getKey(), Toast.LENGTH_SHORT);
            toast.show();

        }
    });
  

Здесь обрабатывается нажатие:

  mDatabase.child("testing").push().setValue(newBike);
  

Данные Firebase:

 "testing" : {  
 "-KTA7xijNrK1SK98rZns" : {     
  "color" : "Rjfu",      
  "frameSize" : 0,         
  "make" : "Ggg",     
  "other" : "Xhfhf",     
  "stolen" : false
},

"-KTABiJuH2-RXwmp0Rcu" : {   
"color" : "Red",     
"frameSize" : 0,      
"make" : "Test ",      
"other" : "No",      
"stolen" : false
}
  

Поэтому, когда я нажимаю на элемент в списке, я хочу вернуть ссылку KTA7xijNrK1SK98rZns или что бы это ни было. В тосте в первом фрагменте кода все, что я возвращаю, — это testing строка в каждом щелчке родительской ссылки.

Любая помощь приветствуется.

Ответ №1:

Вы говорите, что у вас есть FirebaseListAdapter . Если это так, вы можете получить ссылку на определенный элемент в позиции с adapter.getRef() помощью .

 myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
        DatabaseReference itemRef = adapter.getRef(position);

        Toast toast = Toast.makeText(getActivity().getApplicationContext(), itemRef.getKey(), Toast.LENGTH_SHORT);
        toast.show();
    }
});
  

Комментарии:

1. Я использую пользовательский адаптер arraylist, что мне следует сделать, чтобы добиться того же, что и выше??

2. Привет, я использовал приведенный выше код, но получил эту ошибку Variable 'adapter' is accessed from within inner class, needs to be declared final , но когда я сделал adapter final, вместо этого я получил ошибку error: incompatible types: String cannot be converted to DatabaseReference

3. Хороший улов, правильный метод getRef . Я обновил код в ответе.