【发布时间】:2019-07-28 17:20:46
【问题描述】:
我正在尝试为帖子上显示的用户生成帖子创建一个计时器。我正在使用 Firestore 存储有关帖子的所有信息。
我的代码确实显示了计时器,但是当多个用户发布多个帖子时,计时器在正确时间和另一个倒计时之间闪烁,据我所知,这是不相关的。这是我所拥有的:
这就是我创建每个帖子的方式。
post.setTimer(data.getStringExtra("timerDuration"));
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, setEndDate());
Date endtime = cal.getTime();
post.setTimerEndDate(endtime);
addPhotoInfoToDatabase();
finish();
我的片段适配器:
adapter = new FirestoreRecyclerAdapter<Post, PostViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull PostViewHolder postViewHolder, int position, @NonNull Post post) {
postViewHolder.setPost(post);
}
@NonNull
@Override
public PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_view_layout, parent, false);
return new PostViewHolder(view);
}
};
如果您需要更多信息,请告诉我。感谢您的帮助。
编辑:
我的应用程序还包含一个ViewPager,我注意到当我从问题计时器滑开并向后滑动时,问题就得到了解决。
更新:
void setPost(final Post post) {
ImageView imageView1 = view.findViewById(R.id.firstImageCardView);
ImageView imageView2 = view.findViewById(R.id.secondImageCardView);
ImageView profilePic = view.findViewById(R.id.user_image);
TextView username = view.findViewById(R.id.user_name);
final TextView timer = view.findViewById(R.id.timer);
final Button chooseRight = view.findViewById(R.id.choose_right);
final Button chooseLeft = view.findViewById(R.id.choose_left);
final Button follow = view.findViewById(R.id.follow);
String displayName;
final String userId = currentUser.getUid();
final String postId = post.getUserId();
setProfilePicture(post);
final DocumentReference docRefUsers = db
.collection("users")
.document(currentUser.getUid());
final DocumentReference docRefFollowing = db
.collection("following")
.document(currentUser.getUid())
.collection("UserIsFollowing")
.document(post.getUserId());
final DocumentReference docRefPosts = db
.collection("posts")
.document(post.getUserId())
.collection("userPosts")
.document(post.getDate().toString());
if (userId.equals(postId)) {
displayName = "Me";
chooseLeft.setEnabled(false);
chooseRight.setEnabled(false);
follow.setText("");
follow.setEnabled(false);
} else if (post.getUsername() == null) {
displayName = "Anonymous";
} else {
displayName = post.getUsername();
}
if (post.getProfilePicture() != null) {
Picasso.get().load(post.getProfilePicture())
.transform(new CircleTransformActivity())
.fit()
.centerCrop()
.into(profilePic);
username.setText(displayName);
} else {
Picasso.get().load(R.drawable.blank_profile_pic)
.transform(new CircleTransformActivity())
.fit()
.into(profilePic);
}
/***********************************************************/
if(post.getTimerEndDate() != null) {
Date date = java.util.Calendar.getInstance().getTime();
long currentTime = date.getTime();
long endTime = post.getTimerEndDate().getTime();
long timeLeft = endTime - currentTime;
new CountDownTimer(timeLeft, 1000) {
@SuppressLint("DefaultLocale")
public void onTick(long millisUntilFinished) {
timer.setText(String.format("%02d:%02d:%02d",
(int) ((millisUntilFinished / (1000 * 60 * 60)) % 24),
(int) ((millisUntilFinished / (1000 * 60)) % 60),
(int) (millisUntilFinished / 1000) % 60));
//here you can have your logic to set text to edittext
}
public void onFinish() {
timer.setText("done!");
}
}.start();
}
Picasso.get()
.load(post.getImageUrl_1())
.fit()
.transform(new RoundedCornersTransformation(30, 30))
.into(imageView1);
Picasso.get()
.load(post.getImageUrl_2())
.fit()
.transform(new RoundedCornersTransformation(30, 30))
.into(imageView2);
if (!postId.equals(userId)) {
docRefFollowing.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
if (documentSnapshot != null && documentSnapshot.exists()) {
follow.setText("Following");
follow.setEnabled(false);
}
}
});
}
follow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final Map<String, Object> following = new HashMap<>();
following.put("Exists", true);
docRefFollowing.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
docRefFollowing.set(following);
docRefUsers.update("following", FieldValue.increment(1));
}
}
});
db.collection("users")
.document(postId)
.update("followers", FieldValue.increment(1));
follow.setText("Following");
}
});
if (!postId.equals(userId)) {
docRefPosts.collection("voted")
.document(currentUser.getUid()).addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
if (documentSnapshot != null && documentSnapshot.exists()) {
whichVoted = documentSnapshot.get("votedFor").toString();
}
if (whichVoted != null) {
switch (whichVoted) {
case ("left"):
chooseLeft.setEnabled(false);
chooseRight.setEnabled(true);
break;
case ("right"):
chooseRight.setEnabled(false);
chooseLeft.setEnabled(true);
break;
}
} else {
chooseRight.setEnabled(true);
chooseLeft.setEnabled(true);
}
}
});
}
chooseLeft.setText(post.getLeftText());
chooseRight.setText(post.getRightText());
chooseLeft.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
chooseLeft.setEnabled(false);
chooseRight.setEnabled(true);
upLeft(docRefPosts, chooseLeft);
}
});
chooseRight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
chooseRight.setEnabled(false);
chooseLeft.setEnabled(true);
upRight(docRefPosts, chooseRight);
}
});
}
【问题讨论】:
-
“不同时间之间的闪烁”很难理解。强调。
-
已澄清。这样更好吗?
标签: java android google-cloud-firestore countdowntimer