Как я могу получить все значения из ключа из БД Firebase Realtime? - PullRequest
0 голосов
/ 19 сентября 2019

Я хочу получить все значения из ключа внутри ключа категории.

Я использую AndroidX, Gradle 5.1.1 и работаю со следующей структурой:

db-name
    category1
        unique_random_id: value
        unique_random_id2: value_value
    category2
        unique_random_id: value
        unique_random_id2: value_value
    ListView lv;
    FirebaseDatabase fb;
    DatabaseReference dr;

    ArrayList<Article> list;
    ArrayAdapter<Article> adapter;
    Article article;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.articlelist);

        Intent intent = getIntent();
        Bundle gotExtras = intent.getExtras();

        final TextView articleCatShow = (TextView)findViewById(R.id.articleCatShow);
        articleTopCat.setText(gotExtras.getString("cat"));

        article = new Article();
        lv = (ListView)findViewById(R.id.listView);
        fb = FirebaseDatabase.getInstance();
        dr = fb.getReference(gotExtras.getString("cat"));

        list = new ArrayList<>();
        adapter = new ArrayAdapter<Article>(this, R.layout.article_each, R.id.articleTxt, list);

        dr.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot ds: dataSnapshot.getChildren()) {
                    adapter.add(ds.getValue(Article.class));
                    lv.setAdapter(adapter);
                }
            }

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

            }
        });

    }

Зависимости Gradle:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation 'com.google.firebase:firebase-analytics:17.2.0'
    implementation 'com.google.firebase:firebase-core:17.2.0'
    implementation 'com.google.firebase:firebase-database:19.1.0'
}

Я ожидалчто у списка есть данные.

Я также получаю эту ошибку, когда запускаю приложение и нажимаю кнопку, которая будет собираться с экстрами Can't convert an object of type java.lang.String to type <my-hidden-package-name>

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Измените это:

       dr.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot ds: dataSnapshot.getChildren()) {
                    adapter.add(ds.getValue(Article.class));
                    lv.setAdapter(adapter);
                }
            }

на это:

       dr.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    adapter.add(dataSnapshot.getValue(Article.class));
                    lv.setAdapter(adapter);
                }
            }

Удаление цикла for, поскольку при итерации вы получаете значения типа String, а не типаВаша посылка.

0 голосов
/ 19 сентября 2019

Хорошо!Я нашел ответ.Для структуры базы данных, подобной этой

db-name:
    category:
        unique_id_very_random: value

, я сделал

ArrayList<String> collectValues = new ArrayList<>();
for(DataSnapshot ds : dataSnapshot) {
    collectValues.add(ds.getValue(String.class));
}
adapter = new ArrayAdapter<String>(YOURACTIVITYJAVAFILENAME.this, R.layout.value_each, R.id.valuePerTxtValue, collectValues); // change YOURACTIVITYJAVAFILENAME to your java file name of the screen where you are showing the list and create a layout and put a textvalue inside the layout (basically its like how you want each items to look like, i think) and change 'R.layout.value_each' to 'R.layout.the_new_layout_name' and 'R.id.valuePerTxtValue' to the new text values name like 'R.id.text_value_name'
lv.setAdapter(adapter);

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