android - 如何从 FIREBASE 将数据检索到回收站 View

标签 android json firebase android-recyclerview

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


    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.menu_recycler);
    recyclerView.setHasFixedSize(true);

    LinearLayoutManager linearLayout = new LinearLayoutManager(this);
    linearLayout.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(linearLayout);

    MenuHomeAdapter menuHomeAdapter = new MenuHomeAdapter(this, createList(7));

    recyclerView.setAdapter(menuHomeAdapter);

    //FireBase
    Firebase.setAndroidContext(this);
    // Get a reference to our posts
    Firebase ref = new Firebase("LINK");

    // Attach an listener to read the data at our posts reference
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                Menu post = postSnapshot.getValue(Menu.class);
                Toast.makeText(MenuHome.this, post.getSNo() + "-" + post.getDishName(), Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            System.out.println("The read failed: " + firebaseError.getMessage());
        }
    });
}

如何在回收站 View 中显示数据。我尝试了一些方法,但并不合适。Toast 有效,但所有其他选项都是错误的。我只想在回收站 View 中显示来自 firebase 的数据。

最佳答案

正如 helldawg 评论的那样,您需要创建自己的适配器:

  • 监听来自 Firebase 的 onDataChange 调用
  • 保留来自 Firebase 的数据的内部副本
  • 在数据改变时通知RecyclerView
  • 在需要时创建 View 持有者
  • 将 Firebase 数据中的数据绑定(bind)到 View

我能很快想出的最低限度是:

public static class MenuHomeAdapter extends RecyclerView.Adapter<MenuViewHolder> {
    ArrayList<Menu> items = new ArrayList<>();

    public MenuHomeAdapter(Firebase ref) {
        ref.addValueEventListener(new ValueEventListener() {
            public void onDataChange(DataSnapshot snapshot) {
                items.clear();
                for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                    Menu menu = postSnapshot.getValue(Menu.class);
                    items.add(menu);
                }
                notifyDataSetChanged();
            }

            public void onCancelled(FirebaseError firebaseError) {
                System.out.println("The read failed: " + firebaseError.getMessage());
            }
        });
    }

    public MenuViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
        return new MenuViewHolder(view);
    }

    public void onBindViewHolder(MenuViewHolder holder, int position) {
        Menu item = items.get(position);
        holder.getTitleView().setText(item.getTitle());
    }

    public int getItemCount() {
        return items.size();
    }
};

要在上下文中查看它,请查看 Activity34962254 (以您的问题编号命名)this Github repo .

您会注意到,实现这一点非常重要。虽然这个实现有效,但它并不是最理想的。例如:当更改/添加/删除单个项目时,将重建整个列表。这是导致性能不佳的秘诀。

除非您有特殊需求,否则您可能会更好 using the FirebaseRecyclerAdapter from the FirebaseUI project .要全面了解所提供的内容,我推荐此 codelab for building a chat app with FirebaseUI

关于android - 如何从 FIREBASE 将数据检索到回收站 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34962254/

相关文章:

android - Easypermissions 不返回方法

json - VB.NET动态地将Newtonsoft JSON反序列化为对象

javascript - 我无法在 javascript 中从 firebase 中获取数据

android - 如何在 Android 主屏幕上制作 4x1 大小的小部件?

Android Studio Espresso 测试错误 : Empty Test Suite

mysql - Flutter 如何从 JSON 列出具有多个子项的数组

java - ref.updateChildren() 中的 FirebaseException : Path X is an ancestor of X/Y in an update

firebase - 如何通过RPC监听Firestore

firebase - Flutter-用户登录Firebase时FutureBuilder无法重建吗?

java - 我想在 ViewModel 类中的 Retrofit 失败时显示 Toast 消息