Android 如何从FIREBASE将数据检索到回收器视图
如何在“回收器”视图中显示数据。我尝试了一些方法,但不正确。Toast有效,但所有其他选项都错误。我只想在“回收器”视图中显示firebase中的数据。正如helldawg评论的那样,您需要创建自己的适配器:Android 如何从FIREBASE将数据检索到回收器视图,android,json,firebase,android-recyclerview,Android,Json,Firebase,Android Recyclerview,如何在“回收器”视图中显示数据。我尝试了一些方法,但不正确。Toast有效,但所有其他选项都错误。我只想在“回收器”视图中显示firebase中的数据。正如helldawg评论的那样,您需要创建自己的适配器: 侦听来自Firebase的onDataChange调用 保存来自Firebase的数据的内部副本 当数据更改时,通知RecyclerView 在需要时创建视图保持架 将Firebase数据中的数据绑定到视图 我能很快想出的最低要求是: @Override protected void
- 侦听来自Firebase的
调用onDataChange
- 保存来自Firebase的数据的内部副本
- 当数据更改时,通知
RecyclerView
- 在需要时创建视图保持架
- 将Firebase数据中的数据绑定到视图
@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());
}
});
}
公共静态类MenuHomeAdapter扩展了RecyclerView.Adapter{
ArrayList items=新建ArrayList();
公共菜单HomeAdapter(Firebase参考){
ref.addValueEventListener(新的ValueEventListener(){
公共无效onDataChange(数据快照快照){
items.clear();
对于(DataSnapshot postSnapshot:snapshot.getChildren()){
Menu Menu=postsnashot.getValue(Menu.class);
项目。添加(菜单);
}
notifyDataSetChanged();
}
取消后的公共无效(FirebaseError FirebaseError){
System.out.println(“读取失败:+firebaseError.getMessage());
}
});
}
公共菜单UncreateViewHolder onCreateViewHolder(视图组父级,int-viewType){
View View=LayoutInflater.from(parent.getContext()).flate(android.R.layout.simple\u list\u item\u 1,parent,false);
返回新的MenuViewHolder(视图);
}
BindViewHolder上的公共void(菜单项文件夹持有者,int位置){
菜单项=项。获取(位置);
holder.getTitleView().setText(item.getTitle());
}
public int getItemCount(){
返回items.size();
}
};
要在上下文中查看,请查看上的(以问题编号命名)
您将注意到,实现这一点非常重要。虽然这个实现可以工作,但它是相当次优的。例如:更改/添加/删除单个项目时,将重新生成整个列表。这是造成糟糕表现的原因
除非你有特殊需要,否则你可能会过得更好。要全面了解它所提供的功能,我建议您这样做,正如helldawg评论的那样,您需要创建自己的适配器:
- 侦听来自Firebase的
调用onDataChange
- 保存来自Firebase的数据的内部副本
- 当数据更改时,通知
RecyclerView
- 在需要时创建视图保持架
- 将Firebase数据中的数据绑定到视图
@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());
}
});
}
公共静态类MenuHomeAdapter扩展了RecyclerView.Adapter{
ArrayList items=新建ArrayList();
公共菜单HomeAdapter(Firebase参考){
ref.addValueEventListener(新的ValueEventListener(){
公共无效onDataChange(数据快照快照){
items.clear();
对于(DataSnapshot postSnapshot:snapshot.getChildren()){
Menu Menu=postsnashot.getValue(Menu.class);
项目。添加(菜单);
}
notifyDataSetChanged();
}
取消后的公共无效(FirebaseError FirebaseError){
System.out.println(“读取失败:+firebaseError.getMessage());
}
});
}
公共菜单UncreateViewHolder onCreateViewHolder(视图组父级,int-viewType){
View View=LayoutInflater.from(parent.getContext()).flate(android.R.layout.simple\u list\u item\u 1,parent,false);
返回新的MenuViewHolder(视图);
}
BindViewHolder上的公共void(菜单项文件夹持有者,int位置){
菜单项=项。获取(位置);
holder.getTitleView().setText(item.getTitle());
}
public int getItemCount(){
返回items.size();
}
};
要在上下文中查看,请查看上的(以问题编号命名)
您将注意到,实现这一点非常重要。虽然这个实现可以工作,但它是相当次优的。例如:更改/添加/删除单个项目时,将重新生成整个列表。这是造成糟糕表现的原因
除非你有特殊需要,否则你可能会过得更好。为了全面了解它所提供的功能,我推荐这篇这里有一个非常好的教程 这将为您提供所需的功能,同时FirebaseUI也为您提供了许多可供使用的功能 现在,如果您还想包括数据绑定: 自定义视窗夹
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();
}
};
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
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();
}
};
public class YourViewHolder extends RecyclerView.ViewHolder {
public YourItemBinding binding;
public YourViewHolder(View itemView) {
super(itemView);
binding = DataBindingUtil.bind(itemView);
}
public YourItemBinding getBinding() {
return binding;
}
}
mAdapter=new FirebaseRecyclerAdapter(YourFirebaseItem.class,android.R.layout.two\u line\u list\u item,YourViewHolder.class,mRef){
@凌驾
public void populateViewHolder(您的viewHolder viewHolder、您的FireBaseItem项、int位置){
YourItemBinding=viewHolder.getBinding();
绑定。设置项(项);
}
};
回收商。setAdapter(mAdapter);
这里有一个非常好的教程
这将为您提供所需的功能,同时FirebaseUI也为您提供了许多可供使用的功能
现在,如果您还想包括数据绑定:
自定义视窗夹
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();
}
};
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
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();
}
};
public class YourViewHolder extends RecyclerView.ViewHolder {
public YourItemBinding binding;
public YourViewHolder(View itemView) {
super(itemView);
binding = DataBindingUtil.bind(itemView);
}
public YourItemBinding getBinding() {
return binding;
}
}
mAdapter=new FirebaseRecyclerAdapter(YourFirebaseItem.class,android.R.layout.two\u line\u list\u item,YourViewHolder.class,mRef){
@凌驾
public void populateViewHolder(您的viewHolder viewHolder、您的FireBaseItem项、int位置){
YourItemBinding=viewHolder.getBinding();
绑定。设置项(项);
}
};
回收商。setAdapter(mAdapter);
为什么不简单地使用
@覆盖
创建时受保护的空(B