Intereting Posts

Отображение изображений хранилища в базе данных RecyclerView

Привет, я задал более ранний вопрос о отображении изображения с помощью Base64 из моей базы данных Firebase. Было рекомендовано использовать хранилище для базы. Я переработал свой код, и все загружается в хранилище и базу данных firebase, как и должно быть. Проблема в том, что когда я сохраняю данные, ничего не заполняется в моем recyclerview. Все пусто.

Любая помощь, которую вы можете предоставить мне, чтобы заставить ее работать, была бы замечательной. Благодарю.

EDIT: В моем классе активности я вызываю кнопку clicklistener для активации камеры. Как только изображение будет снято, оно будет сохранено в хранилище Firebase. Затем я загружаю изображение из хранилища и отображаю его в режиме recyclerview. Я понимаю часть загрузки, но мне трудно понять часть загрузки и отображения. Благодарю.

Viewholder: метод связывания

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

Solutions Collecting From Web of "Отображение изображений хранилища в базе данных RecyclerView"

Я предлагаю вам добавить метод setImage в свой RecyclerView.ViewHolder И сохранить URL-адрес вашего изображения в объекте, который вы извлекаете в свой FirebaseRecyclerAdapter .

В моем случае Im использует Glide для управления изображениями моего приложения:

Мой пример:

 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-адрес, но я предлагаю вам сохранить его как другой параметр в вашем пользовательском объекте, будучи динамическим, если вы хотите получать эти данные более одного раза, даже если вы не загружаете изображение.

Надеюсь, что это вам поможет!

Для этой цели уже существует официальная реализация.

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

Основная идея – загрузить изображение в хранилище firebase и сохранить URL-адрес изображения в базе данных, а затем загрузить его по этой ссылке.

В классе MyDownloadService.java использовался метод 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(); } }); } } 

Используйте адаптер Custom list для обработки списка и для обработки imageView используйте GLIDE, который обеспечивает простой способ загрузки изображений с помощью ссылки на хранилище.

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

👆👆👆 Ссылка на создание адаптера списка и просмотр изображений и текстовое изображение

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

👆👆👆 Ссылка, чтобы сохранить изображение сфокусированного огня в внешнюю память

Вам просто нужно вызвать нужное изображение для определенного вида в listview