How do I setup FirebaseAdapter in Android Studio?

2020-02-01 18:05发布

问题:

I am trying to read data in real time from Firebase into a custom ArrayAdapter. From my research, it looks like FirebaseListAdapter has built in functionality to handle this. However, I am unable to get my code to recognize the FirebaseListAdapter class. How do I get the FirebaseListAdapter to work?

Gradle File

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.0"

    defaultConfig {
        applicationId "com.example.quizzingcompanion"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.google.firebase:firebase-database:9.6.0'
    compile 'com.google.firebase:firebase-core:9.6.0'
    compile 'com.google.firebase:firebase-auth:9.6.0'
    compile 'com.android.support:appcompat-v7:24.1.1'
    compile 'com.android.support:design:24.1.1'
    compile 'com.android.support:support-v4:24.1.1'
    compile 'com.firebase:firebase-client-android:2.3.1'
    compile 'com.firebaseui:firebase-ui:0.6.0'
    compile 'com.firebaseui:firebase-ui-storage:0.6.0'
    compile 'com.firebaseui:firebase-ui-database:0.6.0'
}

apply plugin: 'com.google.gms.google-services'

FirebaseAdapter Initialization

FirebaseListAdapter<Participant> adapter = new FirebaseListAdapter;

Error Messages

Failed to resolve: com.google.firebase:firebase-auth:9.6.0
Failed to resolve: com.google.firebase:firebase-storage:9.6.0
Failed to resolve: com.google.firebase:firebase-database:9.6.0
Failed to resolve: com.google.android.gms:play-services-auth:9.6.0
Cannot resolve symbol FirebaseListAdapter

Fragment with List

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import java.util.ArrayList;

/**
 * A simple {@link Fragment} subclass.
 */
public class ParticipantFragment extends Fragment {
    private DataSource data;
    DatabaseReference database;
    ArrayList<Participant> participants = new ArrayList<>();

    public ParticipantFragment() {
        data = new DummyDataSource();
        database = FirebaseDatabase.getInstance().getReference();
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        final View rootView = inflater.inflate(R.layout.content_participants_fragment, container, false);

        FirebaseListAdapter<Participant> adapter = new FirebaseListAdapter;
        ListView listView = (ListView) rootView.findViewById(R.id.participants_list);
        ParticipantAdapter adapter = new ParticipantAdapter(getActivity(), data.getParticipants());
        listView.setAdapter(adapter);

        FloatingActionButton fab = (FloatingActionButton) rootView.findViewById(R.id.participants_fab);
        fab.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(getContext(), NewParticipant.class);
                startActivity(intent);
            }
        });}

Custom Adapter

import android.app.Activity;
import android.media.Image;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by Tim on 9/10/2016.
 */
public class ParticipantAdapter extends ArrayAdapter {
    public ParticipantAdapter(Activity context, ArrayList<Participant> participant) {
        super(context, 0, participant);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View listItemView = convertView;
        if(listItemView == null){
            listItemView = LayoutInflater.from(getContext()).inflate(R.layout.participants_list_item, parent, false);
        }

        Participant currentParticipant = (Participant) getItem(position);

        ImageView participantImage = (ImageView) listItemView.findViewById(R.id.participant_image);
        if(currentParticipant.hasImageValue()){
            participantImage.setImageResource(currentParticipant.getImageID());
        }else{
            participantImage.setImageResource(R.drawable.ic_my_profile);
        }

        TextView name = (TextView) listItemView.findViewById(R.id.participant_name);
        name.setText(currentParticipant.getDisplayName());

        ImageView image = (ImageView) listItemView.findViewById(R.id.participant_role);
        switch (currentParticipant.getRole()){
            case "Official": image.setImageResource(R.drawable.ic_official);
            case "Spectator": image.setImageResource(R.drawable.ic_spectator);
            case "Quizzer": image.setImageResource(R.mipmap.ic_quizzer);
            default: image.setVisibility(View.GONE);
        }

        return listItemView;
    }
}

Where Values are Added

Button okBtn = (Button) findViewById(R.id.add_participant);
        okBtn.setOnClickListener(new View.OnClickListener() {
            @Override

            public void onClick(View view) {
                DatabaseReference ref = database.child("participants");
                EditText firstName = (EditText)  findViewById(R.id.first_name);
                EditText lastName = (EditText)  findViewById(R.id.last_name);
                Participant newParticipant = new Participant(firstName.getText().toString(),
                                                                lastName.getText().toString(),
                                                                sp.getSelectedItem().toString(),
                                                                sp2.getSelectedItem().toString());
                Map<String, Object> participantValues = newParticipant.toMap();
                ref.push().setValue(participantValues);
            }
        });

回答1:

The FirebaseUI readme has this handy compatibility table:

FirebaseUI  Firebase/Play 
 Version    Services Version
   1.2.0       10.2.0
   1.1.1       10.0.0 or 10.0.1
   1.0.1       10.0.0 or 10.0.1
   1.0.0       9.8.0
   0.6.2       9.8.0
   0.6.1       9.6.1
   0.6.0       9.6.0
   0.5.3       9.4.0
   0.4.4       9.4.0
   0.4.3       9.2.1
   0.4.2       9.2.0
   0.4.1       9.0.2
   0.4.0       9.0.0

So in order to use FirebaseUI 0.6, you will have to use Firebase/Play Services SDK 9.6. If you want to use Firebase/Play Services SDK 9.4, you will have to use FirebaseUI 0.5.

In addition you're missing an import statement for the list adapter:

import com.firebase.ui.database.FirebaseListAdapter;

Android Studio should already be giving you hints about this import.



回答2:

Maybe you can change the Firebase dependencies to the newest version.

compile 'com.google.firebase:firebase-database:9.6.0'
compile 'com.google.firebase:firebase-core:9.6.0'
compile 'com.google.firebase:firebase-auth:9.6.0'