android - Android Studio 使用 Firebase 数据库的应用中未显示已发布的图片
问题描述
地狱。我是一名 cs 学生,正在为我的项目开发一个应用程序,在这个项目中,用户必须能够发布图像,并且它必须在发布后处于主要活动中,我编写了代码并且没有错误,数据存储在firebase存储和实时数据库中,但唯一的问题是当我运行应用程序时,帖子可见但图像不存在..它显示空白而不是图片,帖子也不在他们应该是正确的顺序。如果我注销并再次登录并添加新帖子,它会低于旧帖子。
这是我的帖子活动:
public class PostActivity extends AppCompatActivity
{
private Toolbar mToolbar;
private ProgressDialog loadingBar;
private ImageButton SelectPostImage;
private Button UpdatePostButton;
private EditText PostDescription;
private static final int Gallery_Pick = 1;
private Uri ImageUri;
private String Description;
private StorageReference PostsImagesRefrence;
private DatabaseReference UsersRef, PostsRef;
private FirebaseAuth mAuth;
private String saveCurrentDate, saveCurrentTime, postRandomName, downloadUrl, current_user_id;
private long countPosts = 0;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_post);
mAuth = FirebaseAuth.getInstance();
current_user_id = mAuth.getCurrentUser().getUid();
PostsImagesRefrence = FirebaseStorage.getInstance().getReference();
UsersRef = FirebaseDatabase.getInstance().getReference().child("Users");
PostsRef = FirebaseDatabase.getInstance().getReference().child("Posts");
SelectPostImage = (ImageButton) findViewById(R.id.select_post_image);
UpdatePostButton = (Button) findViewById(R.id.new_post_button);
PostDescription =(EditText) findViewById(R.id.post_caption);
loadingBar = new ProgressDialog(this);
mToolbar = (Toolbar) findViewById(R.id.update_post_page_toolbar);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setTitle("Update Post");
SelectPostImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
OpenGallery();
}
});
UpdatePostButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
ValidatePostInfo();
}
});
}
private void ValidatePostInfo()
{
Description = PostDescription.getText().toString();
if(ImageUri == null)
{
Toast.makeText(this, "Please select post image...", Toast.LENGTH_SHORT).show();
}
else if(TextUtils.isEmpty(Description))
{
Toast.makeText(this, "Please say something about your image...", Toast.LENGTH_SHORT).show();
}
else
{
loadingBar.setTitle("Adding New Post");
loadingBar.setMessage("Please wait for a while...");
loadingBar.show();
loadingBar.setCanceledOnTouchOutside(true);
StoringImageToFirebaseStorage();
}
}
private void StoringImageToFirebaseStorage()
{
Calendar calFordDate = Calendar.getInstance();
SimpleDateFormat currentDate = new SimpleDateFormat("dd-MMMM-yyyy");
saveCurrentDate = currentDate.format(calFordDate.getTime());
//Calendar calFordTime = Calendar.getInstance();
//SimpleDateFormat currentTime = new SimpleDateFormat("HH:mm");
//saveCurrentTime = currentTime.format(calFordDate.getTime());
Calendar calForTime=Calendar.getInstance();
@SuppressLint("SimpleDateFormat") SimpleDateFormat currentTime =new SimpleDateFormat("HH:mm:ss");
saveCurrentTime=currentTime.format(calForTime.getTime());
postRandomName = saveCurrentDate + saveCurrentTime;
StorageReference filePath = PostsImagesRefrence.child("Post Images").child(ImageUri.getLastPathSegment() + postRandomName + ".jpg");
filePath.putFile(ImageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task)
{
if(task.isSuccessful())
{
//downloadUrl = task.getResult().getMetadata().getReference().getDownloadUrl().toString();
downloadUrl = task.getResult().getStorage().getDownloadUrl().toString();
//Toast.makeText(PostActivity.this, "image uploaded successfully to Storage...", Toast.LENGTH_SHORT).show();
SavingPostInformationToDatabase();
}
else
{
String message = task.getException().getMessage();
Toast.makeText(PostActivity.this, "Error occured: " + message, Toast.LENGTH_SHORT).show();
}
}
});
}
private void SavingPostInformationToDatabase()
{
PostsRef.addValueEventListener(new ValueEventListener() //counting the number of posts
{
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
{
if(snapshot.exists())
{
countPosts = snapshot.getChildrenCount();
}
else
{
countPosts = 0;
}
}
@Override
public void onCancelled(@NonNull DatabaseError error)
{
}
});
UsersRef.child(current_user_id).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
if(dataSnapshot.exists())
{
String userFullName = dataSnapshot.child("fullname").getValue().toString();
String userProfileImage = dataSnapshot.child("profileimage").getValue().toString();
HashMap postsMap = new HashMap();
postsMap.put("uid", current_user_id);
postsMap.put("date", saveCurrentDate);
postsMap.put("time", saveCurrentTime);
postsMap.put("description", Description);
postsMap.put("postimage", downloadUrl);
postsMap.put("profileimage", userProfileImage);
postsMap.put("fullname", userFullName);
postsMap.put("counter", countPosts);
PostsRef.child(current_user_id + postRandomName).updateChildren(postsMap)
.addOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task)
{
if(task.isSuccessful())
{
SendUserToMainActivity();
Toast.makeText(PostActivity.this, "New Post is updated successfully.", Toast.LENGTH_SHORT).show();
loadingBar.dismiss();
}
else
{
Toast.makeText(PostActivity.this, "Error Occured while updating your post.", Toast.LENGTH_SHORT).show();
loadingBar.dismiss();
}
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void OpenGallery()
{
Intent galleryIntent = new Intent();
galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
galleryIntent.setType("image/*");
startActivityForResult(galleryIntent, Gallery_Pick);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==Gallery_Pick && resultCode==RESULT_OK && data!=null)
{
ImageUri = data.getData();
SelectPostImage.setImageURI(ImageUri);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
int id = item.getItemId();
if(id == android.R.id.home)
{
SendUserToMainActivity();
}
return super.onOptionsItemSelected(item);
}
private void SendUserToMainActivity()
{
Intent mainIntent = new Intent(PostActivity.this, MainActivity.class);
startActivity(mainIntent);
}
}
这是我的主要活动:
{
private NavigationView navigationView;
private DrawerLayout drawerLayout;
private ActionBarDrawerToggle actionBarDrawerToggle;
private RecyclerView postList;
private Toolbar mToolbar;
private CircleImageView NavProfileImage;
private TextView NavProfileUserName;
private ImageButton AddNewPostButton;
private FirebaseAuth mAuth;
private DatabaseReference UsersRef, PostsRef, LikesRref;
String currentUserID;
Boolean LikeChecker = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAuth = FirebaseAuth.getInstance();
currentUserID = mAuth.getCurrentUser().getUid();
UsersRef = FirebaseDatabase.getInstance().getReference().child("Users");
PostsRef = FirebaseDatabase.getInstance().getReference().child("Posts");
LikesRref = FirebaseDatabase.getInstance().getReference().child("Likes");
mToolbar = (Toolbar) findViewById(R.id.main_page_toolbar);
setSupportActionBar(mToolbar);
getSupportActionBar().setTitle("Home");
AddNewPostButton = (ImageButton) findViewById(R.id.add_new_post_button);
drawerLayout = (DrawerLayout) findViewById(R.id.drawable_layout);
actionBarDrawerToggle = new ActionBarDrawerToggle(MainActivity.this , drawerLayout, R.string.drawer_open , R.string.drawer_close);
drawerLayout.addDrawerListener(actionBarDrawerToggle);
actionBarDrawerToggle.syncState();
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
navigationView = (NavigationView) findViewById(R.id.navigation_view);
postList = (RecyclerView) findViewById(R.id.all_users_post_list);
postList.setHasFixedSize(true);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setReverseLayout(true);
linearLayoutManager.setStackFromEnd(true);
postList.setLayoutManager(linearLayoutManager);
View navView = navigationView.inflateHeaderView(R.layout.navigation_header);
NavProfileImage = (CircleImageView) navView.findViewById(R.id.nav_profile_image);
NavProfileUserName = (TextView) navView.findViewById(R.id.nav_profile_full_name);
UsersRef.child(currentUserID).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
{
if(snapshot.exists())
{
if (snapshot.hasChild("fullname"))
{
String fullname = snapshot.child("fullname").getValue().toString();
NavProfileUserName.setText(fullname);
}
if(snapshot.hasChild("profileimage"))
{
String image = snapshot.child("profileimage").getValue().toString();
Picasso.get().load(image).placeholder(R.drawable.profile).into(NavProfileImage);
}
else
{
//Toast.makeText(MainActivity.this,"Profile Name Do Not Exist!", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item)
{
UserMenuSelector(item);
return false;
}
});
AddNewPostButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
SendUserToPostActivity();
}
});
DisplayAllUsersPosts();
}
private void DisplayAllUsersPosts()
{
Query SortPosts = PostsRef.orderByChild("counter");
FirebaseRecyclerOptions<Posts> options =
new FirebaseRecyclerOptions.Builder<Posts>()
.setQuery(PostsRef, Posts.class)
.build();
FirebaseRecyclerAdapter<Posts, PostsViewHolder> firebaseRecyclerAdapter =
new FirebaseRecyclerAdapter<Posts, PostsViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull PostsViewHolder holder, int position, @NonNull Posts model) {
final String PostKey = getRef(position).getKey();
holder.setFullname(model.getFullname());
holder.setTime(model.getTime());
holder.setDate(model.getDate());
holder.setDescription(model.getDescription());
holder.setProfileimage(getApplicationContext(), model.getProfileimage());
holder.setPostimage(getApplicationContext(), model.getPostimage());
//holder.setPostimage(getApplicationContext(), model.getPostimage());
//Picasso.
holder.setLikeButtonStatus(PostKey);
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
Intent clickPostIntent = new Intent(MainActivity.this, ClickPostActivity.class);
clickPostIntent.putExtra("PostKey", PostKey);
startActivity(clickPostIntent);
}
});
holder.CommentPostButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Intent commentsIntent = new Intent(MainActivity.this, CommentsActivity.class);
commentsIntent.putExtra("PostKey", PostKey);
startActivity(commentsIntent);
}
});
holder.LikePostButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
LikeChecker = true;
LikesRref.addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
{
if(LikeChecker.equals(true))
{
if(snapshot.child(PostKey).hasChild(currentUserID)) //if like already exist
{
LikesRref.child(PostKey).child(currentUserID).removeValue();
LikeChecker = false;
}
else
{
LikesRref.child(PostKey).child(currentUserID).setValue(true);
LikeChecker = false;
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error)
{
}
});
}
});
}
@NonNull
@Override
public PostsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.all_post_layout,parent, false);
PostsViewHolder viewHolder = new PostsViewHolder(view);
return viewHolder;
}
};
firebaseRecyclerAdapter.startListening();
postList.setAdapter(firebaseRecyclerAdapter);
//postList.setAdapter(firebaseRecyclerAdapter);
}
public static class PostsViewHolder extends RecyclerView.ViewHolder
{
View mView;
ImageButton LikePostButton, CommentPostButton;
TextView DisplayNoOfLikes;
int countLikes;
String currentUserId;
DatabaseReference LikesRef;
public PostsViewHolder(@NonNull View itemView) {
super(itemView);
mView = itemView;
LikePostButton = (ImageButton) mView.findViewById(R.id.like_button);
CommentPostButton = (ImageButton) mView.findViewById(R.id.comment_button);
DisplayNoOfLikes = (TextView) mView.findViewById(R.id.display_no_of_likes);
LikesRef = FirebaseDatabase.getInstance().getReference().child("Likes");
currentUserId = FirebaseAuth.getInstance().getCurrentUser().getUid();
}
public void setLikeButtonStatus(final String PostKey)
{
LikesRef.addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
{
if(snapshot.child(PostKey).hasChild(currentUserId))
{
countLikes = (int) snapshot.child(PostKey).getChildrenCount(); //counting the number of likes
LikePostButton.setImageResource(R.drawable.like);
DisplayNoOfLikes.setText((Integer.toString(countLikes) + (" Like(s)")));
}
else
{
countLikes = (int) snapshot.child(PostKey).getChildrenCount(); //counting the number of likes
LikePostButton.setImageResource(R.drawable.dislike);
DisplayNoOfLikes.setText((Integer.toString(countLikes) + (" Like(s)")));
}
}
@Override
public void onCancelled(@NonNull DatabaseError error)
{
}
});
}
public void setFullname(String fullname)
{
TextView username = (TextView) mView.findViewById(R.id.post_user_name);
username.setText(fullname);
}
public void setProfileimage(Context ctx, String profileimage)
{
CircleImageView image = (CircleImageView) mView.findViewById(R.id.post_profile_image);
Picasso.get().load(profileimage).placeholder(R.drawable.profile).into(image);
}
public void setTime(String time)
{
TextView PostTime = (TextView) mView.findViewById(R.id.post_time);
PostTime.setText(" " + time);
}
public void setDate(String date)
{
TextView PostDate = (TextView) mView.findViewById(R.id.post_date);
PostDate.setText(" "+date);
}
public void setDescription(String description)
{
TextView PostDescription = (TextView) mView.findViewById(R.id.post_description);
PostDescription.setText(description);
}
public void setPostimage(Context ctx, String postimage)
{
ImageView Postimage = (ImageView) mView.findViewById(R.id.post_image);
Picasso.get().load(postimage).into(Postimage);
}
}
private void SendUserToPostActivity()
{
Intent addNewPostIntent = new Intent(MainActivity.this, PostActivity.class);
startActivity(addNewPostIntent);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item)
{
if (actionBarDrawerToggle.onOptionsItemSelected(item))
{
return true;
}
return super.onOptionsItemSelected(item);
}
private void UserMenuSelector(MenuItem item)
{
switch (item.getItemId() )
{
case R.id.nav_post:
SendUserToPostActivity();
break;
}
}}
还有我的帖子类:
package com.example.pingoo;
public class Posts
{
public String uid, time, date, postimage, description, profileimage,fullname;
public Posts()
{
}
public Posts(String uid, String time, String date, String postimage, String description, String profileimage, String fullname)
{
this.uid = uid;
this.time = time;
this.date = date;
this.postimage = postimage;
this.description = description;
this.profileimage = profileimage;
this.fullname = fullname;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getPostimage() {
return postimage;
}
public void setPostimage(String postimage) {
this.postimage = postimage;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getProfileimage() {
return profileimage;
}
public void setProfileimage(String profileimage) {
this.profileimage = profileimage;
}
public String getFullname() {
return fullname;
}
public void setFullname(String fullname) {
this.fullname = fullname;
}
}
我从主要活动中删除了一些不必要的部分,以使代码更短。
感谢您的帮助..提前谢谢您。
解决方案
推荐阅读
- angular6 - 如何在 ngOnInit 获得 localstorage 的值
- python - Python随机生成每个实例的种子
- arrays - 在 Matlab 中使用匿名 fnc 时如何将值存储到数组中以绘制它们
- game-maker - GameMaker Studio 2 - 中心 + 钳位相机变焦
- tensorflow - 从 tfrecords 中的不平衡数据生成平衡批次
- php - 如何在 html 和 php 中制作 PIVOT(Crosstab)
- amazon-web-services - AWS 和 kubernetes 卷 - 如何跨多个 Pod 共享配置?
- stanford-nlp - CoreNLP:为什么输出结果只包含单独的字母而不是单独的单词?
- solr - 使用 Solr 搜索。如何包含其他人搜索的内容。
- outlook - 如何使用 ms-graph 获取 office365 人员页面 [目录/所有用户] 中的所有用户数据