2016-01-23 54 views
1
@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()); 
     } 
    }); 
} 

如何在回收视图中显示数据。我尝试了一些方法,但它不是正确的。敬酒的作品,但所有其他选项都是错误的。我只是想在回收站视图中显示来自Firebase的数据。如何从FIREBASE中检索数据到回收站视图

+0

你必须让自己的适配器扩展RecyclerViewAdapter,你不得不做出这样的定义您recyclerview的每一行是如何布局文件,然后你需要传递的数据通过适配器recyclerview。有很多例子,比如使用来自MYSQL,JSON的数据填充recyclerview,或者使用什么API –

回答

8

由于helldawg评论,你需要创建自己的适配器:

  • 监听从火力地堡
  • 不断从火力地堡
  • 数据的内部副本onDataChange电话通知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(); 
    } 
}; 

要看到它的背景下,看Activity34962254this Github repo(你的问题的数量而得名)。

你会注意到,实现这是相当不平凡的。虽然这个实现起作用,但它是非常不理想的。例如:当单个项目被更改/添加/删除时,整个列表被重建。这是糟糕表现的秘诀。

除非你有特定的需求,否则你可能会更好using the FirebaseRecyclerAdapter from the FirebaseUI project。要获得它提供什么完整的演练中,我建议这个codelab for building a chat app with FirebaseUI

+0

如果数据集很大,这会一次加载所有数据?是否有一些延迟加载的例子(取决于适配器位置的限制与第一个/最后一个的组合将是我的猜测)? –

4

这里有

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); 
1

为什么不直接使用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); 
} 
相关问题