Получение изображений в recyclerview из Firebase Firestore

Я пытаюсь получить изображения из Firebase Firestore. Я могу успешно получить текст в RecyclerView, однако я не уверен, как получить изображения.

Я смотрел на похожие вопросы, к сожалению, ни один из них не помог.

ListActivity:

    //initialize firestore
    db = FirebaseFirestore.getInstance();

    //initialize views
    mRecyclerView = findViewById(R.id.resultRecycle);
    //set recycler view properties
    mRecyclerView.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(layoutManager);

    //show  data in recycler view
    showData();
}

private void showData() {

    db.collection("Item")
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {

                    //called when data is retrieved
                    //show data
            for(DocumentSnapshot doc: task.getResult()){

                        Model model = new 
                    Model(doc.getString("id"),
                                doc.getString("Title"),
                                doc.getString("Location"),
                                //STUCK HERE
                        );


                        modelList.add(model);
                    }

                    //adapter
                    adapter = new CustomAdapter(ListActivity.this, modelList);
                    //set adapter to recycler view
                    mRecyclerView.setAdapter(adapter);

                }
            });

CustomAdapter:

public void onItemClick(View view, int position) {
            //this will be called when user clicks an item

            //show data on toast when clicking
            String title = modelList.get(position).getTitle();
            String location = modelList.get(position).getLocation();
            String  url = modelList.get(position).getUrl();
        }

        @Override
        public void onItemLongClick(View view, int position) {
            //this will be called when user clicks long item
        }
    });

    return viewHolder;
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int i) {
    //bind views /set data
    holder.mTitle.setText(modelList.get(i).getTitle());
    holder.mLocation.setText(modelList.get(i).getLocation());
    Picasso.get().load(modelList.get(i).getUrl()).into(holder.mUrl);

}

Просмотрите ссылку на изображение ниже, спасибо,  введите описание изображения здесь


comment
Можете ли вы опубликовать URL-адрес изображения и структуру базы данных?   -  person Ashish    schedule 03.09.2019
comment
Добавьте структуру своей базы данных в виде скриншота. Пожалуйста, также ответьте @AlexMamo   -  person Alex Mamo    schedule 03.09.2019
comment
@Ashish, пожалуйста, посмотрите скриншот выше   -  person Neha    schedule 03.09.2019
comment
@Neha Вы уверены, что предоставленный вами URL-адрес изображения не может работать, пока изображение не будет в вашем хранилище в том же месте, где оно отображается в базе данных Firebase.   -  person Ashish    schedule 03.09.2019
comment
@ Ашиш, прости, не пойму   -  person Neha    schedule 03.09.2019
comment
URL-адрес, который вы указали в своей базе данных. Это расположение изображения в хранилище, поэтому оно не будет работать ни с одним другим, пока не будет доступно то же изображение и то же место.   -  person Ashish    schedule 03.09.2019
comment
Есть ли способ правильно хранить его? @Ashish   -  person Neha    schedule 03.09.2019
comment
@Neha, я предлагаю использовать Firebase Storage и обновить URL-адрес базы данных.   -  person Ashish    schedule 03.09.2019
comment
В настоящее время я использую хранилище Firebase для загрузки изображений .. @ Ashish   -  person Neha    schedule 03.09.2019
comment
Присоединяйтесь к чату. Комментарии становятся слишком большими.   -  person Ashish    schedule 03.09.2019
comment
Не могу присоединиться, пока у меня не будет 20 репутации, к сожалению, @Ashish   -  person Neha    schedule 03.09.2019
comment
Затем, пожалуйста, опубликуйте код, который вы пробовали, для сохранения URL-адреса изображения в базе данных и загрузите код изображения.   -  person Ashish    schedule 03.09.2019
comment
Позвольте нам продолжить это обсуждение в чате.   -  person Ashish    schedule 03.09.2019
comment
почему ты не делаешь doc.getString("Img");?   -  person Peter Haddad    schedule 03.09.2019
comment
@PeterHaddad возвращает список без изображений   -  person Neha    schedule 03.09.2019
comment
@PeterHaddad Пожалуйста, проверьте структуру ее базы данных. Это расположение изображения на устройстве Android.   -  person Ashish    schedule 03.09.2019
comment
да, я знаю, что это местоположение на устройстве Android, просто спрашивал, почему она не делает doc.getString("Img");, чтобы получить его   -  person Peter Haddad    schedule 03.09.2019
comment
@PeterHaddad, я думаю, она пробовала, но ее изображения не загружаются в Glide.   -  person Ashish    schedule 03.09.2019


Ответы (3)


Используйте код загрузчика файлов, чтобы загрузить изображение в базу данных Firebase.

Но убедитесь, что вы запускаете Fileuploader при нажатии любой кнопки. Или он выдаст исключение nullpointer, если ваш текст редактирования пуст.

private void Fileuploader(){ 
    if(imguri != null ) { 
        StorageReference ref = mStorageRef.child("Item"); 
        Toast.makeText(UploadActivity.this, "Upload in progress", Toast.LENGTH_LONG).show(); 
        ref.putFile(imguri) 
            .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
                @Override 
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
                        Toast.makeText(UploadActivity.this, "Image uploaded successfully!", Toast.LENGTH_LONG).show(); 
                        Task<Uri> urlTask = taskSnapshot.getStorage().getDownloadUrl();
                        while (!urlTask.isSuccessful());
                        Uri downloadUrl = urlTask.getResult();
                        saveData(downloadUrl); 
                    } 
                }) 
            .addOnFailureListener(new OnFailureListener() { 
                @Override 
                    public void onFailure(@NonNull Exception exception) { 
                        Toast.makeText(getApplicationContext(), exception.getMessage(), Toast.LENGTH_LONG).show(); 
                    } 
            }); 
    } 
}

Функция запустится автоматически, когда загрузка файла будет успешно завершена.

private void saveData(Uri imguri) { 
    Map<String, String> data = new HashMap<>(); 
    EditText title = findViewById(R.id.etv_1); 
    EditText shortDesc = findViewById(R.id.etv_2); 
    TextView location = findViewById(R.id.etv_3); 
    String eTitle = title.getText().toString(); 
    String eShortDesc = shortDesc.getText().toString(); 
    String eLocation = location.getText().toString(); 
    String eUrl = imguri.toString(); 
    userid = FirebaseAuth.getInstance().getUid(); 
    getCate(); 
    data.put("Img", eUrl); 
    data.put("Title", eTitle); 
    data.put("Location", eLocation); 
    data.put("Short Description", eShortDesc); 
    data.put("Category", cate ); 
    data.put("id", userid); 
    db.collection("Item").add(data); 
    Toast.makeText(this, "Successfully saved your item", Toast.LENGTH_SHORT).show(); 
    Intent i = new Intent(this, Home.class); 
    startActivity(i);
}
person Ashish    schedule 03.09.2019
comment
пожалуйста, посмотрите изображение для структуры базы данных для изображения после обновления кода выше - person Neha; 03.09.2019

У меня есть лучший пример получения изображений в recyclerview из Firebase Firestore .. ссылка здесь ...

https://www.simplifiedcoding.net/firebase-storage-example/

на этом веб-сайте даны лучшие подсказки и учебники здесь .. пожалуйста, следуйте пошагово ...

person hardy thummar    schedule 03.09.2019

Эй, я думаю, это может помочь с использованием Пикассо

Picasso.with(context).load(ImageURL).into(imageView);
person JAtoms    schedule 04.02.2020