如何从FIREBASE中将数据检索到回收站视图 [英] how to retrieve data to a recycler view from FIREBASE

查看:140
本文介绍了如何从FIREBASE中将数据检索到回收站视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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


工具栏工具栏=(工具栏)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);
//获取对我们帖子的引用
Firebase ref = new Firebase(LINK);

//附加一个监听器来读取我们的帖子中的数据参考
ref.addValueEventListener(new ValueEventListener(){
@Override $ b $ 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();
}
}
$ b $ @覆盖
public void onCancelled(FirebaseError firebaseError){
System.out.println(The read failed:+ firebaseError.getMessage());
}
});





$ b

如何在回收站视图中显示数据。我尝试了一些方法,是不正确的。吐司的作品,但所有其他选项都是错的。我只是想在回收站的视图显示来自firebase的数据。 解决方案


$ b

  • 监听 onDataChange 来自Firebase的调用

  • 保留Firebase数据的内部副本

  • 通知 RecyclerView
  • 在需要时创建视图持有者
  • 将Firebase数据中的数据绑定到视图
  • li>


我能想到的最低限度是:

  public static class MenuHomeAdapter extends RecyclerView.Adapter< MenuViewHolder> {
ArrayList< Menu> items = new ArrayList<>();
$ b公共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()) ;
}
});
}
$ b $ public MenuViewHolder onCreateViewHolder(ViewGroup parent,int viewType){
View view = LayoutInflater.from(parent.getContext())。inflate(android.R.layout。 simple_list_item_1,parent,false);
返回新的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 (以您问题的编号命名),位于此Github资料库

你会注意到,这是相当不重要的。而这个实现工作,这是相当不理想的。例如:当单个项目被更改/添加/删除时,整个列表被重建。这是一个糟糕的表现。\\ b
$ b

除非你有特定的需求,你可能更好 FirebaseRecyclerAdapter 来使用-android#using-firebaseui-to-populate-a-recyclerviewrel =nofollow noreferrer>。要全面了解所提供的功能,我建议您使用 codelab构建一个聊天应用程序FirebaseUI


@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());
        }
    });
}

how to display the data in the recycler view.I tried some methods but it was not proper.the Toast works but all other option are wrong.I just want to display the data from firebase in a recycler view.

解决方案

As helldawg commented, you'll need to create your own adapter that:

  • listens to onDataChange calls from Firebase
  • keeps an internal copy of the data from Firebase
  • informs the RecyclerView when the data changes
  • creates view holders when those are needed
  • binds data from the Firebase data to the view

The minimum I could come up with quickly is:

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();
    }
};

To see it in context, look at Activity34962254 (named after the number of your question) on this Github repo.

You'll note that implementing this is fairly non-trivial. And while this implementation works, it is pretty sub-optimal. For example: when a single item is changed/added/deleted, the entire list is rebuilt. That's a recipe for bad performance.

Unless you have specific needs, you're probably better off using the FirebaseRecyclerAdapter from the FirebaseUI project. To get a full walkthrough of what that offers, I recommend this codelab for building a chat app with FirebaseUI

这篇关于如何从FIREBASE中将数据检索到回收站视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆