gpt4 book ai didi

android - 使用 Firestore UI 从 Firestore 检索数据并将其显示在 RecyclerView 中不适用于 API 24+

转载 作者:行者123 更新时间:2023-11-29 02:18:06 25 4
gpt4 key购买 nike

在我的应用程序中有一个 Activity ,当它打开时它应该在 RecyclerView 中显示数据。数据存储在 Firestore 的一个集合中,但不幸的是它只适用于 API 21、22 和 23,上面的所有内容都没有显示数据(见屏幕截图)。有时它也不会在用户第一次打开 Activity 时显示数据,只有当他第二次打开它或注销并再次登录时(在 API 21 中)。这是已知的东西还是我的代码有问题?或者有没有更好的方法在 RecyclerView 中显示集合的数据?

我还注意到一个奇怪的行为:

当我在布局中添加一个 EditText 而没有在 Activity 中对其进行任何操作时,当用户单击 EditText 时,所需的文档就会按应有的方式显示。在运行 API 21 的模拟器上,无需单击 EditText 即可显示数据,因此上述行为适用于 API greater 24。有人可以解释此行为吗?

非常感谢任何帮助!

Result as desired Result for API 24+

我遵循了本教程,一切正常:

https://www.youtube.com/watch?v=lAGI6jGS4vs

我的应用仅针对从 21 开始的 API。

这是我使用 RecyclerView 的 Activity :

public class PrizeGameActivity extends AppCompatActivity {

private Toolbar mToolbar;

private FirebaseFirestore db = FirebaseFirestore.getInstance();
private CollectionReference prizesRef = db.collection("Prizes");

private PrizeGameAdapter prizeGameAdapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_prize_game);

// Sets the custom toolbar as ActionBar
mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowTitleEnabled(false);

setUpRecyclerView();
}

private void setUpRecyclerView() {

Query query = prizesRef.orderBy("text",Query.Direction.ASCENDING);

FirestoreRecyclerOptions<Prizes> options = new FirestoreRecyclerOptions.Builder<Prizes>()
.setQuery(query, Prizes.class)
.build();

prizeGameAdapter = new PrizeGameAdapter(options);

RecyclerView recyclerView = findViewById(R.id.recycler_view_prize_game);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(prizeGameAdapter);

prizeGameAdapter.startListening();
}

@Override
protected void onStart() {
super.onStart();
if(prizeGameAdapter != null)
{
prizeGameAdapter.startListening();
}
}

@Override
protected void onStop() {
super.onStop();
if(prizeGameAdapter != null)
{
prizeGameAdapter.startListening();
}
}

// Makes a left to right animation when user clicks the back button of the toolbar
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
return true;
}
return false;
}

// Makes a right left animation when clicking the back button
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
}
}

这是我的适配器:

public class PrizeGameAdapter extends FirestoreRecyclerAdapter<Prizes, PrizeGameAdapter.PrizeGameHolder> {

public PrizeGameAdapter(@NonNull FirestoreRecyclerOptions<Prizes> options) {
super(options);


}

@Override
protected void onBindViewHolder(@NonNull PrizeGameHolder holder, int position, @NonNull Prizes model) {

holder.textViewPrizeGame.setText(model.getText());

}

@NonNull
@Override
public PrizeGameHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem_prize_game,parent, false);
return new PrizeGameHolder(view);
}

class PrizeGameHolder extends RecyclerView.ViewHolder {

TextView textViewPrizeGame;

public PrizeGameHolder(@NonNull View itemView) {
super(itemView);

textViewPrizeGame = itemView.findViewById(R.id.listitem_text_view_prize_game);
}
}

}

这是我的奖品类:

public class Prizes {

public Prizes (){

}

public String text;

public String getText() {
return text;
}

public void setText(String text) {
this.text = text;
}

public Prizes(String text) {
this.text = text;
}
}

最佳答案

我设法通过添加 OnCompleteListener 并设置 RecyclerView 来获得所需的结果。这是代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_prize_game);

Query query = prizesRef.orderBy("text",Query.Direction.ASCENDING);

FirestoreRecyclerOptions<Prizes> options = new FirestoreRecyclerOptions.Builder<Prizes>()
.setQuery(query, Prizes.class)
.build();

prizeGameAdapter = new PrizeGameAdapter(options);

query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if(task.isSuccessful()){
setUpRecyclerView();
}else {

}
}
});
}

private void setUpRecyclerView() {

RecyclerView recyclerView = findViewById(R.id.recycler_view_prize_game);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(prizeGameAdapter);

prizeGameAdapter.startListening();
}

@Override
protected void onStart() {
super.onStart();
if(prizeGameAdapter != null)
{
prizeGameAdapter.startListening();
}
}

@Override
protected void onStop() {
super.onStop();
if(prizeGameAdapter != null)
{
prizeGameAdapter.startListening();
}
}

关于android - 使用 Firestore UI 从 Firestore 检索数据并将其显示在 RecyclerView 中不适用于 API 24+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58902066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com