Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从FIREBASE将数据检索到回收器视图_Android_Json_Firebase_Android Recyclerview - Fatal编程技术网

Android 如何从FIREBASE将数据检索到回收器视图

Android 如何从FIREBASE将数据检索到回收器视图,android,json,firebase,android-recyclerview,Android,Json,Firebase,Android Recyclerview,如何在“回收器”视图中显示数据。我尝试了一些方法,但不正确。Toast有效,但所有其他选项都错误。我只想在“回收器”视图中显示firebase中的数据。正如helldawg评论的那样,您需要创建自己的适配器: 侦听来自Firebase的onDataChange调用 保存来自Firebase的数据的内部副本 当数据更改时,通知RecyclerView 在需要时创建视图保持架 将Firebase数据中的数据绑定到视图 我能很快想出的最低要求是: @Override protected void

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

正如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();
}
};
要在上下文中查看,请查看上的(以问题编号命名)

您将注意到,实现这一点非常重要。虽然这个实现可以工作,但它是相当次优的。例如:更改/添加/删除单个项目时,将重新生成整个列表。这是造成糟糕表现的原因


除非你有特殊需要,否则你可能会过得更好。要全面了解它所提供的功能,我建议您这样做,正如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