【问题标题】:Images don't appear in RecyclerView using Firebase-UI, Firestore as database and Picasso使用 Firebase-UI、Firestore 作为数据库和 Picasso 时,图像不会出现在 RecyclerView 中
【发布时间】:2019-01-01 04:13:45
【问题描述】:

我正在使用 Firebase-UIFirestoreFirebase Storage url 字符串加载图像并显示到 RecyclerView 使用 毕加索

我在数据库中有 2 个变量:名称和图像 url 名称出现在 recyclerview 中但图像不是什么问题导致图像不出现。

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <TextView
        android:id="@+id/text_view_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginBottom="8dp"
        android:layout_marginTop="8dp"
        android:text="Name"
        android:textColor="@android:color/black"
        android:textSize="20sp" />
    <ImageView
        android:id="@+id/image_view_upload"
        android:layout_width="match_parent"
        android:layout_height="200dp" />
</LinearLayout>

 public class Upload {
 private String mName;
 private String mImageUrl;

 public Upload() {
 //empty constructor needed
 }

 public Upload(String name, String imageUrl) {
 if (name.trim().equals("")) {
      name = "No Name";
 }

 mName = name;
 mImageUrl = imageUrl;
 }

 public String getName() {
 return mName;
 }

 public void setName(String name) {
 mName = name;
 }

 public String getImageUrl() {
 return mImageUrl;
 }

 public void setImageUrl(String imageUrl) {
 mImageUrl = imageUrl;
 }
   }

包 com.example.amr.firebasestorage;

 public class ImageActivity extends AppCompatActivity {
 private RecyclerView recyclerView;

 private FirebaseFirestore firebaseFirestor;
 private FirestoreRecyclerAdapter<Upload, ImageActivity.ImageViewHolder> 
 Adapter;

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

 //=========firebase==============
 firebaseFirestor = FirebaseFirestore.getInstance();
 //===============================
 //==========Recycler Items========
 recyclerView = findViewById(R.id.recycler_view);
 recyclerView.setHasFixedSize(true);
 recyclerView.setLayoutManager(new LinearLayoutManager(this));

 Query query = firebaseFirestor.collection("uploads")
    ;
 FirestoreRecyclerOptions<Upload> options = new FirestoreRecyclerOptions.Builder<Upload>()
     .setQuery(query, Upload.class)
     .build();
 Adapter = new FirestoreRecyclerAdapter<Upload, ImageViewHolder>(options) {
      @Override
      protected void onBindViewHolder(@NonNull ImageViewHolder holder, int 
      position, @NonNull Upload model) {


      holder.setName(model.getName());

                holder.setImageUrl(model.getImageUrl());


      }

      @NonNull
      @Override
      public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, 
      int viewType) {
      View view = LayoutInflater.from(parent.getContext())
          .inflate(R.layout.image_item, parent, false);

      return new ImageViewHolder(view);
      }
 };
 recyclerView.setAdapter(Adapter);


 }

 public class ImageViewHolder extends RecyclerView.ViewHolder {
 public TextView textViewName;
 public ImageView imageView;
 View mView;

 public ImageViewHolder(View itemView) {
      super(itemView);
      mView=itemView;
      imageView = mView.findViewById(R.id.image_view_upload);

 }

 public void setName(String name) {
      textViewName = mView.findViewById(R.id.text_view_name);
      textViewName.setText(name);
 }
    public void setImageUrl(String imageUrl) {
         imageView = mView.findViewById(R.id.image_view_upload);

         Picasso.get()
                 .load(imageUrl)
                 .fit()
                 .into(imageView);
     }


 }

 @Override
 public void onStart() {
 super.onStart();
 Adapter.startListening();
 }

 @Override
 public void onStop() {
 super.onStop();
 if ( Adapter != null ) {
      Adapter.stopListening();
 }
 }
     }

//主要活动

public class MainActivity extends AppCompatActivity {
 private static final int PICK_IMAGE_REQUEST = 1;

 private Button mButtonChooseImage;
 private Button mButtonUpload;
 private TextView mTextViewShowUploads;
 private EditText mEditTextFileName;
 private ImageView mImageView;
 private ProgressBar mProgressBar;

 private Uri mImageUri;


 //_________
 private StorageTask storageTask;
 private StorageReference storageReference;
 private DocumentReference firebaseFirestore;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 mButtonChooseImage = findViewById(R.id.button_choose_image);
 mButtonUpload = findViewById(R.id.button_upload);
 mTextViewShowUploads = findViewById(R.id.text_view_show_uploads);
 mEditTextFileName = findViewById(R.id.edit_text_file_name);
 mImageView = findViewById(R.id.image_view);
 mProgressBar = findViewById(R.id.progress_bar);
 //________
 storageReference = FirebaseStorage.getInstance().getReference("uploads");
 firebaseFirestore = FirebaseFirestore.getInstance().collection("uploads").document();
 mButtonChooseImage.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      openFileChooser();
      }
 });

 mButtonUpload.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      if ( storageTask != null && storageTask.isInProgress() ) {
           Toast.makeText(MainActivity.this, "wait", Toast.LENGTH_SHORT).show();
      } else {
           uploadFiles();

      }
      }
 });

 mTextViewShowUploads.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      openImagesActivity();
      }
 });
 }

 private void openImagesActivity() {
 Intent inten = new Intent(this, ImageActivity.class);
 startActivity(inten);

 }

 private String getFileExtension(Uri uri) {
 ContentResolver contentResolver = getContentResolver();
 MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
 return mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(uri));

 }

 private void uploadFiles() {
 if ( mImageUri != null ) {
      StorageReference fileRef = storageReference
     //
     .child(System.currentTimeMillis() + "." + getFileExtension(mImageUri));
      //.child("Photos").child(mImageUri.getLastPathSegment());
      storageTask = fileRef.putFile(mImageUri)


     .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
          @Override
          public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
          Handler handler = new Handler();
          handler.postDelayed(new Runnable() {
               @Override
               public void run() {
               mProgressBar.setProgress(0);
               }
          }, 500);
          Toast.makeText(MainActivity.this, "Upload succesful", Toast.LENGTH_SHORT).show();
          Uri downloadUri = taskSnapshot.getUploadSessionUri();

          assert downloadUri != null;
          Upload upload = new Upload(mEditTextFileName
              .getText().toString().trim()
              , downloadUri.toString());

          firebaseFirestore.set(upload);
          }
     })


     .addOnFailureListener(new OnFailureListener() {
          @Override
          public void onFailure(@NonNull Exception e) {
          Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
          }
     })


     .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
          @Override
          public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
          double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
          mProgressBar.setProgress((int) progress);
          }
     });
 } else {
      Toast.makeText(this, "No file selected", Toast.LENGTH_SHORT).show();
 }

 }

 public void openFileChooser() {
 Intent intent = new Intent();
 intent.setType("image/*");
 intent.setAction(Intent.ACTION_GET_CONTENT);
 startActivityForResult(intent, PICK_IMAGE_REQUEST);
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 super.onActivityResult(requestCode, resultCode, data);

 if ( requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK
     && data != null && data.getData() != null ) {
      mImageUri = data.getData();//something back
      Picasso.get().load(mImageUri).into(mImageView);
 }
 }

}

my database

my mobile pic

【问题讨论】:

    标签: android firebase google-cloud-firestore firebase-storage firebaseui


    【解决方案1】:

    问题在于模型类中mName 字段的getter 不正确。当您使用 getName() 作为 getter 时,Firebase 会处理名为 namenot mName 的字段,因为它现在在您的代码中。看到不同?正确的模型类应该如下所示:

    public class Upload {
        private String name;
        private String imageUrl;
    
        public Upload() {}
    
        public Upload(String name, String imageUrl) {
            this.name = name;
            this.imageUrl = imageUrl;
        }
    
        public String getName() { return name; }
    
        public String getImageUrl() { return imageUrl; }
    }
    

    setter 不是必需的,始终是可选的,因为如果 JSON 属性没有 setter,Firebase 客户端会将值直接设置到字段中。但是,如果您希望使用 setter,则您的字段的正确 setter 是:

    public void setName(String name) { this.name = name; }
    
    public void setImageUrl(String imageUrl) { this.imageUrl = imageUrl; }
    

    【讨论】:

    • 名称出现但图像不出现,我不知道问题出在哪里,虽然我按照你说的修复了上传类
    • 不要忘记清除旧数据库并根据您的新模型文件添加新数据。现在可以用了吗?
    • 不起作用,我上传了另一个活动,我的数据库如果有问题请查看
    • 名字出现但图片不出现
    • 我更新了它但它不起作用,请再次查看我的代码并告诉我是否缺少某些东西。我还上传了一张我的手机图片,其中显示了没有图片的名称。
    【解决方案2】:

    我修好了 问题不在于 setter 和 getter,但它就在这里

              Uri downloadUri = taskSnapshot.getUploadSessionUri();
    

    这不是显示我用这个替换它的正确链接

                  Uri downloadUri = taskSnapshot.getDownloadUrl();
    

    完美运行

    【讨论】:

      猜你喜欢
      • 2020-01-09
      • 2022-12-14
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      • 2023-03-29
      • 2021-01-15
      • 2018-03-19
      相关资源
      最近更新 更多