2016-01-23 59 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); 
} 
相關問題