当前位置: 首页 > 面试题库 >

FirestoreAdapter无法正常填充回收站视图

洪梓
2023-03-14
问题内容

我是Android的新秀,因此决定将Cloud
Firestore用作我的数据库,并使用它RecyclerView来填充MainActivity中的列表。我以为Firebase- UI用于Firestore会超级简单,但我不知道为什么RecyclerView中什么也没有。作为参考,这是Firebase
UI页面
,这是我基于我的应用程序创建的示例代码。我想要做的就是填充用户已保存在数据库中的“课程”列表(Course.java如下所示,因为它只是带有名称,日期等的简单POJO,因此未在下面显示)。

主要活动:

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.RecyclerView;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;

import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import com.google.firebase.firestore.Query;
import com.lorin.deadlineschmedline.R;
import com.lorin.deadlineschmedline.adapters.CourseAdapter;

import butterknife.BindView;
import butterknife.ButterKnife;

public class MainActivity extends AppCompatActivity
        implements CourseAdapter.OnCourseSelectedListener,
        PopupMenu.OnMenuItemClickListener {

private FirebaseFirestore mFirestore;
private Query mQuery;
private FirebaseUser mCurrentUser;

private RecyclerView.Adapter mAdapter;

private static final String TAG = "MainActivity";
private static final int RC_SIGN_IN = 9001;
private static final int LIMIT = 50;

@BindView(R.id.rv_course_item_list)
RecyclerView mCourseRecyvlerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showPopup(view);
        }
    });

    // Enable Firestore logging
    FirebaseFirestore.setLoggingEnabled(true);

    // Firestore
    mFirestore = FirebaseFirestore.getInstance();
    mQuery = mFirestore.collection("courses").whereEqualTo("name", true).limit(LIMIT);
    mAdapter = new CourseAdapter(mQuery, this) {
        @Override
        protected void onDataChanged() {
            // Show/hide content if the query returns empty.
            if (getItemCount() == 0) {
                mCourseRecyvlerView.setVisibility(View.VISIBLE);
                //mEmptyView.setVisibility(View.VISIBLE);
            } else {
                mCourseRecyvlerView.setVisibility(View.VISIBLE);
                //mEmptyView.setVisibility(View.GONE);
            }
        }

        @Override
        protected void onError(FirebaseFirestoreException e) {
            // Show a snackbar on errors
            Snackbar.make(findViewById(android.R.id.content),
                    "Error: check logs for info.", Snackbar.LENGTH_LONG).show();
        }
    };

    mCourseRecyvlerView.setLayoutManager(new LinearLayoutManager(this));
    mCourseRecyvlerView.setAdapter(mAdapter);
}

private void showPopup(View v) {
    PopupMenu popup = new PopupMenu(this, v);
    MenuInflater inflater = popup.getMenuInflater();
    inflater.inflate(R.menu.add_component_menu, popup.getMenu());
    popup.setOnMenuItemClickListener(this);
    popup.show();
}

@Override
public void onStart() {
    super.onStart();
    mAdapter.startListening();
}

@Override
public void onStop() {
    super.onStop();

    if (mAdapter != null) {
        mAdapter.stopListening();
    }
}

@Override
public boolean onMenuItemClick(MenuItem item) {
    switch(item.getItemId()) {
        case R.id.add_course:
            startActivity(new Intent(MainActivity.this, AddCourseActivity.class));
            return true;
        case R.id.add_course_component:
            startActivity(new Intent(MainActivity.this, AddCourseComponentActivity.class));
            return true;
        default:
            return true;
    }
}

@Override
public void onCourseSelected(DocumentSnapshot restaurant) {
    // Go to the details page for the selected activity
    Intent intent = new Intent(this, AddCourseActivity.class);
    startActivity(intent);

    //overridePendingTransition(R.anim.slide_in_from_right, R.anim.slide_out_to_left);
}

}

我尝试使用调试器逐步遍历MainActivity,但是查询数据库时,我无法从Firestore中获得任何收益(可能是问题)。任何想法和反馈将不胜感激!


问题答案:

原来是Firestore查询存在问题。以前,我曾经使用过:

mQuery = mFirestore.collection("courses").whereEqualTo("name", true).limit(LIMIT);

但是,似乎在进行Firestore查询时必须使用orderBy()方法。使用下面的技巧:

mQuery = mFirestore.collection("courses").orderBy("name").limit(LIMIT);

现在,我的数据按预期显示在RecyclerView中。



 类似资料:
  • 我试图创建简单的Recyclerview与视图绑定。 问题是我的回收器视图没有分隔线。似乎我所有的物品都是 排成一排。 以下是我的代码: 这里是activity_main。xml: 这里是recyclerview_rows。xml: 房车。Model.kt: RV_Adapter.kt: MainActivity.kt: 有什么问题? [这里是图像:1

  • 问题内容: 我有一个正在使用的。我以前用过但从未遇到过这个问题。 当我上下滚动时,某些项目消失,而某些消失的项目再次出现在底部。 码: : : 问题答案: 重用Views,因此可以说是第一次调用is 。这将导致该行的可见度为。 当又被称为绑定一个新行,该行的观点依然是-没有什么是复位之间势必行。 因此,您的if语句应完全重置状态: 这将确保正确设置每一行的可见性。

  • 我被卡住了。我一直在尝试不同的方法将6个头像字符串的结果加载到picturebox控件数组的加载方法中。 这就是我必须迭代(mysql结果集)值字符串到pictureboxes的内容 但是每个图片框都显示为白色(空白)。如果我将SQL查询设置为LIMIT 1,我将为每个图片框获得相同的第一个头像。但它不会相应地分配,或者根本不会。 我如何才能循环到我的6个图片框正确的网址?谢谢你们 编辑 我也尝试

  • 问题内容: 在使用Hibernate的Spring MVC应用程序中,无法将在ManyToMany关系中连接两个实体的列表正确填充。实体是和。该实体有一个属性,它是名单的实体,而这是不正确填充。有人可以帮我弄清楚如何修正我的代码,以便实体开始正确填充吗? 未能正确填充ArrayList的控制器方法的代码如下: 前面代码中的命令输出以下内容: 从上面的输出可以看到,只有一个对象大于0 。尽管事实是每

  • 当我悬停的时候,我怎样才能填充这个svg?我看了大量的文档,尝试了几种方法,但都没有成功。 这是我的网页: 我在css中尝试了以下内容 以及 甚至 我做错了什么?我应该能够用css完成这项任务,对吗? 编辑:请注意,此图像正被用作背景图像。下面的css中有更多细节: 编辑2:这是. svg代码,但不确定它是否重要

  • 我在带有网格布局管理器的回收器视图中有一个卡片视图。我想删除卡片之间的空间,但也要保留卡片的特定宽度。 这是我的布局活动: 这是我的名片: