图片未从 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 中正确显示。所以不管孩子们是否有一个看起来像01
、02
或-LO061DOhjG2hVZlqY79
的键,都应该显示数据。事实上,它显示,下一个项目的名称,“Western Soups”显示,所以很可能问题出在你的 URL 上。因此,请确保该 URL 确实存在并且包含有效的图像。
【讨论】:
答案的第一部分没有任何区别。如果属性有公共 getter 和 setter,则底层字段的名称对于 JSON 序列化并不重要。事实上,将字段命名为mName
和mImage
是很常见的,这很好,只要:1)字段是私有的,2)公共getter/setter 使用JavaBean 命名约定getName()
/@ 987654330@.
@FrankvanPuffelen 是的,有点搞砸了。你完全正确。刚刚更新了我的答案。谢谢。以上是关于图片未从 Firebase 数据库中的 Picasso 的 URL 加载的主要内容,如果未能解决你的问题,请参考以下文章
当页面数据未从 Firebase 完全加载时显示加载指示器/微调器 - Flutter