2016-09-14 7 views
10

こんにちは、FirebaseデータベースからBase64を使ってイメージを表示することについて以前の質問をしました。 firebase storageを使用することが推奨されました。私は自分のコードを修正し、すべてがfirebaseのストレージとデータベースにロードされます。私が持っている問題は、何もデータを私のrecyclerviewに保存していないときです。すべて空白です。RecyclerViewでfirebaseのストレージイメージを表示

これを機能させるために私に提供できるヘルプは素晴らしいものです。ありがとう。

編集:私のアクティビティクラスでは、私はボタンのクリックリスナーを呼び出してカメラをアクティブにしています。写真が撮影されると、Firebase Storageに保存されます。次に、Storageからイメージをダウンロードし、それをrecyclerviewに表示します。私はアップロードの部分を理解していますが、私はダウンロードと表示の部分を理解するのが難しいです。ありがとう。

viewholder:bindメソッド

public void bind (ImageProgress progress){ 

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

アダプタ

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

メインアクティビティクラス

@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

Firebase Storageを使用するように切り替えたことを聞いてください。それはずっと良くなるはずです。しかし、私たちがすぐに手助けするにはあまりにも多くのコードがここにあります。画像をアップロードしたり、ボタンのクリックを処理したり、データベースから読み込んだりしたりするようです。これを[問題を再現するのに必要な最小限のコード](http://stackoverflow.com/help/mcve)に減らしてください。私たちはあなたを助けることができるより良い機会を得ます。 –

+0

@FrankvanPuffelenこんにちはフランク、私は私の問題がうまくいけばうまく私のコードを編集しました。私は私の問題が何であるかについての詳細な説明を追加しました。事前にお手伝いしてくれてありがとう。 – hozdaman

+0

@FrankvanPuffelenこんにちは、あなたが私の編集したコードを見るチャンスがあったのかしら?ありがとう。 – hozdaman

答えて

4

私はあなたよあなたのRecyclerView.ViewHolderにsetImageメソッドを追加する.ANDあなたのURLを保存示唆FirebaseRecyclerAdapterで取得したオブジェクトの画像です。私の場合は

、イム私のアプリの画像を管理するために Glideを使用して:

マイViewHolder例:

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(); 
} 
} 

そしてここでは、私のデータベース呼び出しは次のとおりです。

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) { 

     } 
    }); 
} 

Firebaseからデータを取得するときに他の値を設定するのと同じ方法でイメージを設定するだけで、既に生成されたnewURLをそれをクラウドにアップロードした後のそのイメージURLを設定する別の方法があるかもしれませんが、画像をアップロードしていなくても、そのデータを複数回取得したい場合は、カスタムオブジェクトの別のパラメータと同じように保持することをお勧めします。

それがあなたを助けてくれることを願っています!

+0

Durdinは私に助けてくれるでしょう。firebaseで画像をアップロードすると、アップロードされた画像が正常にアップロードされ、アップロードされた画像はUIのアダプタで2回表示されます。なぜですか? – Erum

1

すでにこの目的のための公式の実装があります。

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

基本的な考え方は、データベースにfirebaseストレージ、店舗画像のURLに画像をアップロードしてから、このリンクを経由して、それをダウンロードすることです。

mStorageRef.child(downloadPath).getStreamメソッドが使用されましたが、私は入力ストリームを処理しないgetBytesメソッドを実装しました。これは、簡単にGlideでバイトを読み込むことができます。タスクが完了すると、バイトを含むブロードキャストインテントがバンドルとして送信されます。あなたがダウンロードされたときにURイメージをロードするために、あなたが望む場所に放送受信機を聴くことができます。

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

カスタムリストアダプタを使用してlistviewを処理し、imageViewを使用してGLIDEを使用して、ストレージリンクでイメージをロードする簡単な方法を提供します。

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

リンクはあなただけで所望の画像を呼び出す必要が

外部メモリにfirebase sorage画像を保存するために、リストとアダプタとImageViewのとTextViewの

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

リンクを作成しますリストビューでの特定の表示へ

+1

recyclerviewは、これらの目的のためにlistview以上のものが推奨されています。とにかく、あなたが何か答えを提案しているなら、少なくとも「やるべきこと」やいくつかのリンクを与えてください。 –

+0

ok私はあなたがそれを得ることができる私の答えを更新しました。 – pratikpchpr

関連する問題