图片未从 Firebase 数据库中的 Picasso 的 URL 加载

Posted

技术标签:

【中文标题】图片未从 Firebase 数据库中的 Picasso 的 URL 加载【英文标题】:Images not loading from URL by Picasso from Firebase Database 【发布时间】:2019-03-11 05:55:33 【问题描述】:

Firebase image

模型类

 public class Category

    private String Name;
    private String Image;

    public Category(String name, String image) 
        Name = name;
        Image = image;
    

    public Category() 
    

    public String getName() 
        return Name;
    

    public void setName(String name) 
        Name = name;
    

    public String getImage() 
        return Image;
    

    public void setImage(String image) 
        Image = image;
    

活动类

 public class Home extends AppCompatActivity
            implements NavigationView.OnNavigationItemSelectedListener 

        RecyclerView recyclerView;
        RecyclerView.LayoutManager layoutManager;

        FirebaseDatabase database;
        DatabaseReference reference;
        FirebaseStorage storage;
        StorageReference storageReference;

        //Add new menu
        MaterialEditText edtTxtName;
        Button selectImage;
        Button uploadImage;

        //Adding new category
        Category newCategory;
        Uri savedImageUri;
        private final int PICK_IMAGE_REQUEST=71;
        MaterialEditText edtTxtNewCategoryName;

        FloatingActionButton fab;

        FirebaseRecyclerAdapter<Category,MenuViewHolder> recyclerAdapter;


        TextView userName;
        @Override
        protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_home);
            edtTxtNewCategoryName=findViewById(R.id.edt_txt_new_item_name);
            Toolbar toolbar = findViewById(R.id.toolbar);
            toolbar.setTitle("Menu Mangement");
            setSupportActionBar(toolbar);
            fab =findViewById(R.id.fab);


            //Firebase init
            database=FirebaseDatabase.getInstance();
            reference=database.getReference("Category");
            storage=FirebaseStorage.getInstance();
            storageReference=storage.getReference();

            fab.setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View view) 
                    showDailog();
                
            );


            DrawerLayout drawer =findViewById(R.id.drawer_layout);
            ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                    this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
            drawer.addDrawerListener(toggle);
            toggle.syncState();

            NavigationView navigationView = findViewById(R.id.nav_view);
            navigationView.setNavigationItemSelectedListener(this);

            //Setting header name
          /*  View view=navigationView.getHeaderView(0);
            userName = view.findViewById(R.id.username);
            userName.setText(Common.currentUser.getName());*/
            //View init
            recyclerView=findViewById(R.id.recycler_menu);
            layoutManager=new LinearLayoutManager(this);
            recyclerView.setLayoutManager(layoutManager);

            loadMenu();
        

        private void selectImage() 
            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, @Nullable Intent data) 
            if(requestCode==PICK_IMAGE_REQUEST && resultCode==Activity.RESULT_OK
            && data!=null && data.getData()!=null)
            
                savedImageUri=data.getData();//getting uri
                selectImage.setText("Image Selected !");
            
        

        private void uploadImage() 
            final ProgressDialog progressDialog=new ProgressDialog(this);
            progressDialog.setMessage("Uploading Image");
            progressDialog.show();

            String image= UUID.randomUUID().toString();
            final StorageReference imageFolder=storageReference.child("images/"+image);
            imageFolder.putFile(savedImageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() 
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) 
                    progressDialog.dismiss();
                    Toast.makeText(Home.this, "Uploaded", Toast.LENGTH_SHORT).show();
                    imageFolder.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>()
                    
                        @Override
                        public void onSuccess(Uri uri)
                        
                            newCategory=new Category(edtTxtName.getText().toString(),uri.toString());
                            Toast.makeText(Home.this, ""+uri.toString(), Toast.LENGTH_SHORT).show();

                        
                    );

                
            ).addOnFailureListener(new OnFailureListener() 
                @Override
                public void onFailure(@NonNull Exception e) 
                    progressDialog.dismiss();
                    Toast.makeText(Home.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());
                   progressDialog.setMessage("Uploaded "+progress+" %");

                
            );
        

        private void showDailog() 
            final AlertDialog.Builder alertDailog=new AlertDialog.Builder(this);
            alertDailog.setTitle("Add new Category");
            alertDailog.setMessage("Please fill all the fields");

            LayoutInflater inflater=this.getLayoutInflater();
            View view=inflater.inflate(R.layout.add_new_menu_layout,null);
            edtTxtName=view.findViewById(R.id.edt_txt_new_item_name);

            alertDailog.setView(view);
            alertDailog.setIcon(R.drawable.ic_shopping_cart_black_24dp);

            alertDailog.setPositiveButton("Add", new DialogInterface.OnClickListener() 
                @Override
                public void onClick(DialogInterface dialog, int which) 
                    if(newCategory!=null)
                        reference.push().setValue(newCategory);

                    
                
            );

            alertDailog.setNegativeButton("No", new DialogInterface.OnClickListener() 
                @Override
                public void onClick(DialogInterface dialog, int which) 
                    dialog.dismiss();
                
            );
            alertDailog.setNeutralButton("Cancel", new DialogInterface.OnClickListener() 
                @Override
                public void onClick(DialogInterface dialog, int which) 
                    dialog.dismiss();
                
            );
            alertDailog.show();

        

        private void loadMenu()
        
            recyclerAdapter=new FirebaseRecyclerAdapter<Category, MenuViewHolder>(
                    Category.class,R.layout.menu_layout,
                    MenuViewHolder.class,reference) 
                @Override
                protected void populateViewHolder(MenuViewHolder viewHolder, final Category model, int position)
                
                    viewHolder.menuName.setText(model.getName());
                    Picasso.get().load(model.getImage()).into(viewHolder.imageView);

                    viewHolder.setItemClickListner(new ItemClickListner() 
                        @Override
                        public void onClick(View view, int position, boolean isLongClick) 
                            //Getting menuId
                        Intent intent=new Intent(Home.this,FoodList.class);
                        intent.putExtra("CategoryId",recyclerAdapter.getRef(position).getKey());
                        startActivity(intent);
                        
                    );
                
            ;

            recyclerAdapter.notifyDataSetChanged();//notifiy us if data has been changed.
            recyclerView.setAdapter(recyclerAdapter);
        

在活动类中,实现了firebase适配器。通过引用firebase数据库,加载只有id“-LO061DOhjG2hVZlqY79”的图像,但不加载id像'01''02'的图像

适配器加载图像非常缓慢 Output of this code

非常感谢您的帮助

【问题讨论】:

显示你的activity.java类 尝试用Log.e("Firebase", "image url = " + model.getImage();记录网址,看看你得到了什么。 在日志中提供图像 url 很好。但是存储在存储中的图像正在加载,但其他链接的其他 url 图像没有加载。 对不起,我不明白。特别是“ ...但是其他链接未加载的其他网址图像”? 第一个图片 url [图片 url = firebasestorage.googleapis.com/v0/b/eatit-444ed.appspot.com/o/… 【参考方案1】:

因为您使用的是私有字段以及公共 getter 和 setter,所以 Category 类中的字段名称无关紧要。如果您想在类中使用与数据库中不同的名称,可以在 getter 前使用名为 PropertyName 的注解。

正在加载唯一 id 为“-LO061DOhjG2hVZlqY79”的图片,但未加载 id 为“01”“02”的图片

正如我在您的screenshot 中看到的,名称为“Finger Foods”的第一个元素“01”的图像在 UI 中正确显示。所以不管孩子们是否有一个看起来像0102-LO061DOhjG2hVZlqY79 的键,都应该显示数据。事实上,它显示,下一个项目的名称,“Western Soups”显示,所以很可能问题出在你的 URL 上。因此,请确保该 URL 确实存在并且包含有效的图像。

【讨论】:

答案的第一部分没有任何区别。如果属性有公共 getter 和 setter,则底层字段的名称对于 JSON 序列化并不重要。事实上,将字段命名为mNamemImage 是很常见的,这很好,只要:1)字段是私有的,2)公共getter/setter 使用JavaBean 命名约定getName()/@ 987654330@. @FrankvanPuffelen 是的,有点搞砸了。你完全正确。刚刚更新了我的答案。谢谢。

以上是关于图片未从 Firebase 数据库中的 Picasso 的 URL 加载的主要内容,如果未能解决你的问题,请参考以下文章

未从 Firebase 存储加载的用户图像

当页面数据未从 Firebase 完全加载时显示加载指示器/微调器 - Flutter

在 Angular 7 中未从 Firebase 检索数据

Firebase 查询未从数据库返回任何结果

数据未从 Android 应用程序写入 Firebase 实时数据库

数据未从 Android 写入 Firebase 数据库