我已经为我的用户设置了一个活动,用于将消息输入Firebase数据库,另一个活动是随机调用消息。但是,我似乎无法获得随机方法...召回方法只需在点击时反复调用相同的消息。
我正在使用和编辑此处发布的用户名无效的方法get random value android firebase java 所以我真的不明白它是如何运作的......
这是写入数据库的代码:
public class PostActivity extends AppCompatActivity {
private EditText PostField;
private Button postSubmit;
private DatabaseReference mDatabasePosts;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_post);
postSubmit = (Button)findViewById(R.id.postSubmit);
postField = (EditText)findViewById(R.id.postField);
mDatabasePosts = FirebaseDatabase.getInstance().getReference().child("posts");
postSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startPosting();
}
private void startPosting() {
final String postVal = postField.getText().toString().trim();
if (!TextUtils.isEmpty(postVal)) {
//post creation
DatabaseReference newPost = mDatabasePosts.push();
newPost.setValue(postVal);
Toast.makeText(PostActivity.this, "Post registered", Toast.LENGTH_SHORT).show();
startActivity(new Intent(PostActivity.this, HomeActivity.class));
}
}
});
}
}
那里没什么好看的......
关于检索活动,我有一个按钮,可以随机显示一个吐司(好吧......至少目标是)写入数据库的文本......这里是该活动的代码:
DatabaseReference mPost;
mPost = FirebaseDatabase.getInstance().getReference().child("posts");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mPost.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
long allNum = dataSnapshot.getChildrenCount();
int maxNum = (int)allNum;
int randomNum = new Random().nextInt(maxNum);
int count = 0;
Iterable<DataSnapshot> ds = dataSnapshot.getChildren();
Iterator<DataSnapshot> ids = ds.iterator();
String newPost = (String) ids.next().getValue();
while(ids.hasNext() && count < randomNum) {
ids.next();
count ++; // used as positioning.
}
Toast.makeText(HomeActivity.this, newPost,Toast.LENGTH_SHORT).show();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
});
数据库看起来像这样:
posts
L random key: "text 1"
L random key: "text 2"
L random key: "text 3"
L random key: "text 4"
L random key: "text 5"
L random key: "text 6"
所以此刻,每当我点击按钮时......它一直在呼叫&#34;文本1&#34;我希望它交替随机地调用文本1和2 ......
任何人都可以帮我吗?
答案 0 :(得分:1)
数据库看起来像这样:
posts
L random key: "text 1"
L random key: "text 2"
所以此刻,每次我点击按钮......它一直在调用“文本1”我希望它交替随机地调用文本1和2 ......
您正在使用:
int randomNum = new Random().nextInt(maxNum);
其中maxNum = 2
,因为您的数据库中有2个孩子。
如the documentation所述,此方法调用返回“伪随机,均匀分布的int值介于0 (包括)和指定值(不包括)” 。
这意味着您将获得0到1的数字。
因为你这样做:
while(ids.hasNext() && count < randomNum) {
你从0迭代到1,意味着只有text1 ite m。
一般来说,如果您需要生成从min
到max
(包括两者)的数字,请编写
random.nextInt(max - min + 1) + min
答案 1 :(得分:0)
所以,如果有人也试图从Firebase数据库中获取数据集中的随机值,请按以下步骤操作
DatabaseReference mPost;
mPost = FirebaseDatabase.getInstance().getReference().child("posts");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mPost.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
long allNum = dataSnapshot.getChildrenCount();
int maxNum = (int)allNum;
int minNum = 1;
int randomNum = new Random().nextInt(maxNum - minNum + 1) + minNum;
int count = 0;
Iterable<DataSnapshot> ds = dataSnapshot.getChildren();
Iterator<DataSnapshot> ids = ds.iterator();
String newPost = "";
while(ids.hasNext() && count < randomNum) {
newPost = (String) ids.next().getValue();
count ++; // used as positioning.
}
//String msg = newPost.get("boosts").toString();
Toast.makeText(HomeActivity.this, newPost,Toast.LENGTH_LONG).show();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
});