【问题标题】:how to retrieve data to a recycler view from FIREBASE如何从 FIREBASE 将数据检索到回收站视图
【发布时间】:2016-01-23 10:21:30
【问题描述】:
@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());
        }
    });
}

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

【问题讨论】:

  • 你必须制作你自己的扩展 RecyclerViewAdapter 的适配器,你必须制作一个布局文件来定义你的 recyclerview 的每一行是如何的,然后你必须通过适配器将数据传递给 recyclerview。有很多例子,比如用来自 MYSQL、JSON 或什么everl API 的数据填充 recyclerview

标签: android json firebase android-recyclerview


【解决方案1】:

正如 helldawg 所说,您需要创建自己的适配器:

  • 收听来自 Firebase 的 onDataChange 呼叫
  • 保留 Firebase 数据的内部副本
  • 当数据发生变化时通知RecyclerView
  • 在需要时创建视图持有者
  • 将 Firebase 数据中的数据绑定到视图

我能快速想到的最低限度是:

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

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

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

除非您有特定需求,否则您最好使用using the FirebaseRecyclerAdapter from the FirebaseUI project。要全面了解它所提供的功能,我推荐codelab for building a chat app with FirebaseUI

【讨论】:

  • 如果数据集很大,这会一次全部加载,对吗?是否有一些延迟加载的示例(我猜想根据适配器位置将限制组合到第一个/最后一个)?
【解决方案2】:

这里有一个很好的教程

https://github.com/firebase/FirebaseUI-Android#using-firebaseui-to-populate-a-recyclerview

这将为您提供所需的一切,FirebaseUI 也为您提供了很多可玩的东西。

现在,如果您还想包含数据绑定:

自定义 ViewHolder

public class YourViewHolder extends RecyclerView.ViewHolder {

    public YourItemBinding binding;

    public YourViewHolder(View itemView) {
        super(itemView);

        binding = DataBindingUtil.bind(itemView);
    }

    public YourItemBinding getBinding() {
        return binding;
    }
}

FirebaseRecyclerAdapter

mAdapter = new FirebaseRecyclerAdapter <YourFirebaseItem, YourViewHolder> (YourFirebaseItem.class, android.R.layout.two_line_list_item, YourViewHolder.class, mRef) {

    @Override
    public void populateViewHolder(YourViewHolder viewHolder, YourFirebaseItem item, int position) {

        YourItemBinding binding = viewHolder.getBinding();

        binding.setItem(item);

    }
};

recycler.setAdapter(mAdapter);

【讨论】:

    【解决方案3】:

    为什么不简单地使用FirebaseRecyclerAdapter

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    RecyclerView messages = (RecyclerView) findViewById(R.id.messages);
    messages.setLayoutManager(new LinearLayoutManager(this));
    
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
    
    mAdapter = new FirebaseRecyclerAdapter<Chat, ChatHolder>(
            Chat.class,
            R.layout.message,
            ChatHolder.class,
            ref) {
        @Override
        public void populateViewHolder(ChatHolder holder, Chat chat, int position) {
            holder.setName(chat.getName());
            holder.setMessage(chat.getMessage());
        }
    };
    
    messages.setAdapter(mAdapter);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 2019-08-07
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多