2016-09-14 16 views
10

Hallo, ich habe eine frühere Frage zum Anzeigen eines Bildes mit Base64 aus meiner Firebase-Datenbank gestellt. Es wurde empfohlen, Firebase-Speicher zu verwenden. Ich habe meinen Code überarbeitet und alles in den Firebase-Speicher und in die Datenbank geladen, wie es sollte. Das Problem, das ich habe, ist, wenn ich die Daten speichere, die nichts in meiner recyclerview auffüllt. Alles ist leer.Anzeigen von Firebase-Speicherabbildern in einem RecyclerView

Jede Hilfe, die Sie mir zur Verfügung stellen können, um dies zur Arbeit zu bringen, wäre großartig. Vielen Dank.

EDIT: In meiner Aktivitätsklasse rufe ich einen Button clicklistener auf, um die Kamera zu aktivieren. Sobald das Bild aufgenommen wurde, wird es in Firebase Storage gespeichert. Dann lade ich das Bild von Storage herunter und zeige es in einer Recycleransicht an. Ich verstehe den Upload-Teil, aber ich habe Schwierigkeiten, den Download- und Anzeigeteil zu verstehen. Vielen Dank.

viewholder: bind Methode

public void bind (ImageProgress progress){ 

    Glide.with(activity).load("").into(image); 
} 
} 

Adapter

@Override 
public ProgressViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 
    return new ProgressViewHolder(activity, activity.getLayoutInflater().inflate(R.layout.weight_progress_list, parent, false)); 

Hauptaktivitätsklasse

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

    saveButton = (Button) findViewById(R.id.saveButton); 
    progressStatusEditText = (EditText) findViewById(R.id.progressStatusEditText); 
    progressList = (RecyclerView) findViewById(R.id.progressList); 
    mImageButton = (ImageButton) findViewById(R.id.takePictureButton); 
    capturedImage=(ImageView)findViewById(R.id.capturedImageView); 

    LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
    progressList.setHasFixedSize(false); 
    progressList.setLayoutManager(layoutManager); 

    //take picture button 
    mImageButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      openCamera(); 
     } 
    }); 


    mDatabaseReference = database.getReference("Progress"); 

    saveButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      //get current user 
      FirebaseUser user =FirebaseAuth.getInstance().getCurrentUser(); 
      String uid = user.getUid(); 
      ImageProgress progress = new ImageProgress(uid, progressStatusEditText.getText().toString()); 
      mDatabaseReference.push().setValue(progress); 
      progressStatusEditText.setText(""); 
     } 
    }); 
} 

private void openCamera() { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 

     Uri cameraImageURI = data.getData(); 
     //reference where images will be stored 
     mStorageReference = storage.getReference("Progress Images"); 
     //reference to store file 
     final StorageReference cameraImageRef = mStorageReference.child(cameraImageURI.getLastPathSegment()); 
     //upload to firebase storage 
     cameraImageRef.putFile(cameraImageURI) 
       .addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() { 
        @Override 
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
         Uri downloadUrl = taskSnapshot.getDownloadUrl(); 
         progressStatusEditText.setText(downloadUrl.toString()); 
        } 
       }); 
} 
+0

Gut zu höre, dass du zu Firebase Storage gewechselt bist. Das sollte viel besser skalieren. Aber hier gibt es zu viel Code, um schnell zu helfen. Sie scheinen Bilder hochzuladen, Knopfklicks zu handhaben, aus der Datenbank zu lesen und vieles mehr. Reduziere dies auf den [Mindestcode, der benötigt wird, um das Problem zu reproduzieren] (http://stackoverflow.com/help/mcve) und wir haben eine bessere Chance, dir helfen zu können. –

+0

@FrankvanPuffelen Hallo Frank, ich habe meinen Code bearbeitet um hoffentlich wo mein Problem liegt. Ich habe eine weitere Beschreibung meines Problems hinzugefügt. Vielen Dank im Voraus für Ihre Hilfe. – hozdaman

+0

@FrankvanPuffelen Hallo, ich habe mich gefragt, ob du eine Chance hast, meinen bearbeiteten Code anzusehen? Vielen Dank. – hozdaman

Antwort

4

Ich schlage vor, Sie yo setImage Methode auf Ihrem RecyclerView.ViewHolder .und speichern Sie die URL Ihrer hinzufügen Bild in dem Objekt, das Sie in Ihrem FirebaseRecyclerAdapter abrufen.

In meinem Fall ein Im mit Glide die Bilder meiner App verwalten:

Mein ViewHolder Beispiel:

public class UserListViewHolder extends RecyclerView.ViewHolder { 
private final View mView; 
private static final int POST_TEXT_MAX_LINES = 6; 
private ImageView mIconView; 
private TextView mAuthorView; 
private UserClickListener mListener; 

public UserListViewHolder(View itemView) { 
    super(itemView); 
    mView = itemView; 
    mIconView = (ImageView) mView.findViewById(R.id.user_image_profile); 
    mAuthorView = (TextView) mView.findViewById(R.id.user_text_profile); 
    mView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mListener.onUserClick(); 
     } 
    }); 
} 

public void setIcon(String url) { 
    GlideUtil.loadProfileIcon(url, mIconView);//  
} 

public void setPostClickListener(UserClickListener listener) { 
    mListener = listener; 
} 


public void setText(final String text) { 
    if (text == null || text.isEmpty()) { 
     mAuthorView.setVisibility(View.GONE); 
     return; 
    } else { 
     mAuthorView.setVisibility(View.VISIBLE); 
     mAuthorView.setText(text); 
     mAuthorView.setMaxLines(POST_TEXT_MAX_LINES); 
    } 
} 

public interface UserClickListener { 
    void onUserClick(); 
} 
} 

Und hier ist meine Datenbank-Aufruf:

private FirebaseRecyclerAdapter<Person, UserListViewHolder> getFirebaseRecyclerAdapter(Query query) { 
    return new FirebaseRecyclerAdapter<Person, UserListViewHolder>(
      Person.class, R.layout.user_row_item, UserListViewHolder.class, query) { 

     @Override 
     protected void populateViewHolder(UserListViewHolder viewHolder, Person model, int position) { 
      setupUser(viewHolder, model, position, null); 
     } 

    }; 
} 

private void setupUser(final UserListViewHolder UserViewHolder, final Person user, final int position, final String inPostKey) { 
    final String postKey; 
    if (mAdapter instanceof FirebaseRecyclerAdapter) { 
     postKey = ((FirebaseRecyclerAdapter) mAdapter).getRef(position).getKey(); 
    } else { 
     postKey = inPostKey; 
    } 
    FirebaseUtil.getUsersRef().child(postKey).addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(final DataSnapshot dataSnapshot) { 
      UserViewHolder.setPostClickListener(new UserListViewHolder.UserClickListener() { 
       @Override 
       public void onUserClick() { 
        mGroup.addUserToGroup(dataSnapshot.getKey()); 
       } 
      }); 
      UserViewHolder.setIcon(dataSnapshot.child("photoUrl").getValue(String.class)); 
      UserViewHolder.setText(dataSnapshot.child("displayName").getValue(String.class)); 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

Sie müssen das Bild nur so einstellen, wie Sie Ihre anderen Werte beim Abrufen von Daten aus Firebase festgelegt haben, aber mit Ihrer bereits generierten newURL für das Bild nach dem Upload in die Cloud. Vielleicht finden Sie einen anderen Weg, um die URL einfach zu setzen, aber ich empfehle Ihnen, es wie einen anderen Parameter in Ihrem benutzerdefinierten Objekt zu behalten, dynamisch zu sein, wenn Sie diese Daten mehr als einmal abrufen möchten, auch wenn Sie das Bild nicht hochladen.

Hoffe, dass es dir helfen wird!

+0

Durdin können Sie mir helfen, wenn ich Bild auf firebase hochladen dann erfolgreich hochgeladen und sowie das hochgeladene Bild wird zweimal in Adapter in UI warum angezeigt? – Erum

1

Es gibt bereits eine offizielle Implementierung für diesen Zweck.

https://github.com/firebase/quickstart-android/tree/master/storage

Die Grundidee ist das Bild auf die Feuerbasis Lagerung und den Speicher, um die Bild-URL in die Datenbank zu laden und dann über diesen Link herunterladen.

In der MyDownloadService.java-Klasse mStorageRef.child (downloadPath) .getStream-Methode wurde verwendet, aber ich implementiert mit GetBytes-Methode nicht mit Eingabeströmen umzugehen. Da können Bytes einfach mit Glide geladen werden. Wenn die Aufgabe abgeschlossen ist, sendet sie eine Broadcast Intent mit Bytes als Bündel. Sie können den Broadcast-Empfänger wo immer Sie möchten hören, um Ihr Bild zu laden, wenn es heruntergeladen wird.

public class DownloadService extends Service{ 

    private StorageReference mStorageRef; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     // Initialize Storage 
     mStorageRef = FirebaseStorage.getInstance().getReference(); 

    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
    if (ACTION_DOWNLOAD.equals(intent.getAction())) { 


     mStorage.child(downloadPath).getBytes(10*1024*1024).addOnSuccessListener(new OnSuccessListener<byte[]>() { 
      @Override 
      public void onSuccess(byte[] bytes) { 
       Log.d(TAG, "download:SUCCESS " + bytes.length); 

       // Send success broadcast with number of bytes downloaded 
       Intent broadcast = new Intent(ACTION_COMPLETED); 
       broadcast.putExtra(EXTRA_DOWNLOAD_BYTES, bytes); 
       broadcast.putExtra(EXTRA_DOWNLOAD_INDEX, uid); 
       LocalBroadcastManager.getInstance(getApplicationContext()) 
         .sendBroadcast(broadcast); 

       // Mark task completed 
       taskCompleted(); 
      } 
     }).addOnFailureListener(new OnFailureListener() { 
       @Override 
       public void onFailure(@NonNull Exception exception) { 
        Log.w(TAG, "download:FAILURE", exception); 

        // Send failure broadcast 
        Intent broadcast = new Intent(ACTION_ERROR); 
        broadcast.putExtra(EXTRA_DOWNLOAD_PATH, downloadPath); 
        LocalBroadcastManager.getInstance(getApplicationContext()) 
        .sendBroadcast(broadcast); 

        // Mark task completed 
        taskCompleted(); 
       } 
      }); 
    } 

    } 
0

Verwenden Benutzerdefinierte Liste Adapter Listenansicht zu handhaben und Imageview Verwendung GLIDE die einfache Methode des liefert handhaben Bilder mit Speicher Link zu laden.

http://wptrafficanalyzer.in/blog/listview-with-images-and-text-using-simple-adapter-in-android/

Linkliste Adapter mit und Imageview und Textview

https://firebase.google.com/docs/storage/android/download-files

Link erstellen Feuerbasis sorage Bild auf dem externen Speicher

Sie müssen nur anrufen gewünschtes Bild zu speichern zur bestimmten Ansicht in Listenansicht

+1

Die Recyclerview wird mehr als eine Listview für diese Zwecke empfohlen; Wie auch immer, wenn du eine Antwort vorschlägst, gib wenigstens etwas "How-to-do" oder einige Links. –

+0

ok sicher jetzt habe ich meine antwort aktualisiert du kannst es bekommen. – pratikpchpr

Verwandte Themen