2016-09-14 240 views
10

您好,我询问了一个关于在我的Firebase数据库中使用Base64显示图像的问题。建议使用Firebase存储。我重写了我的代码,并且所有内容都应该加载到Firebase存储和数据库中。我遇到的问题是,当我将数据保存到我的回收站视图中时没有任何数据。一切都是空白的。在RecyclerView中显示Firebase存储图像

任何帮助你可以让我得到这个工作将是伟大的。谢谢。

编辑:在我的活动课,我打电话按钮clicklistener来激活相机。一旦拍摄照片,它就会保存到Firebase存储中。然后我从存储中下载它的图像并将其显示在回收站视图中。我了解上传部分,但我很难理解下载和显示部分。谢谢。

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存储。这应该会好很多。但是这里有太多的代码需要我们快速帮忙。您好像正在上传图片,处理按钮点击,从数据库中读取等等。将其降低到[重现问题所需的最低代码](http://stackoverflow.com/help/mcve),我们将有更好的机会帮助您。 –

+0

@FrankvanPuffelen嗨,弗兰克,我编辑了我的代码,希望我的问题在哪里。我添加了更多关于我的问题的描述。在此先感谢您的帮助。 – hozdaman

+0

@FrankvanPuffelen嗨,我想知道你是否有机会看我编辑的代码?谢谢。 – hozdaman

回答

4

我建议你哟您RecyclerView.ViewHolder添加setImage方法。而存储的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用于将该图像上传到云后也许你可以找到另一种方法来设置网址,但是我建议你将它保留为自定义对象中的另一个参数,如果即使不上传图像,也想多次检索该数据,则可以使用它。

希望它能帮助你!

+0

Durdin可以帮助我,当我在firebase上传图片时,它的成功上传以及上传的图片在UI中的适配器中显示两次为什么? – Erum

1

此目的已经有一个正式实施。

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

的基本思想是将图片的网址上传到火力存储和商店的数据库,然后通过这个链接下载。

在MyDownloadService.java类中,使用了mStorageRef.child(downloadPath).getStream方法,但是我使用getBytes方法实现了不处理输入流的方法。因为可以轻松加载Glide字节。当任务完成时,它将包含字节的广播意图作为捆绑发送。您可以随时收听广播接收器,以便在下载时加载您的图像。

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/

链接到创建列表适配器和ImageView的和TextView的

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

链接火力sorage图像保存到外部存储器

你只需要调用所需的图像到列表视图中的特定视图

+1

为实现这些目的,recyclerview比列表视图更推荐;无论如何,如果你提出了一些答案,至少应该提供一点“如何做”或一些链接。 –

+0

好的,我确定现在我更新了答案,你可以得到它。 – pratikpchpr

相关问题