2017-01-12 3 views
3

조각을 사용하는 NavigationDrawer 활동이 있습니다. 내 조각 중 하나에서 Firebase 데이터베이스의 데이터를 RecyclerView로로드하려고합니다.Android - Firebase 데이터베이스의 데이터를 조각으로로드하십시오.

그래서 데이터베이스에 저장 한 객체에 대한 ArrayList가 있습니다. 그런 다음 데이터베이스에서 배열 목록으로 개체를 추가하는 데이터베이스 참조에 ValueEventListener를 추가합니다. 그런 다음 ArrayList를 RecyclerView Adapter에 제공합니다. RecyclerView 어댑터는 내 객체로 목록을 만들어야합니다.

addListenerForSingleValueEvent를 사용할 때 작동하지 않는 경우, 항상 빈 RecyclerView가 표시됩니다. addValueEventListener를 사용할 때 처음부터 작동하지 않지만 가로 방향으로 휴대 전화의 방향을 전환하면 데이터가 갑자기 나타납니다. 그리고 내가 정상적인 방향으로 돌아 가면 여전히 거기에 있습니다. 그러나 처음에는 조각을 열지 않습니다. 여기

이 조각 클래스의 내 코드입니다 : 여기

public class RvAdapter extends RecyclerView.Adapter<RvAdapter.MyViewHolder> { 

    private ArrayList<LogEntry> entries; 

    public RvAdapter(ArrayList<LogEntry> entries){ 
     this.entries = entries; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.log_entry_item, null); 

     return new MyViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 

     SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy"); 
     SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm"); 

     holder.tvAction.setText(entries.get(position).action); 
     holder.tvDate.setText(dateFormat.format(entries.get(position).date)+"\n"+timeFormat.format(entries.get(position).date)); 
     holder.ivIcon.setImageResource(entries.get(position).icon); 

     holder.itemView.setOnClickListener(new View.OnClickListener(){ 

      @Override 
      public void onClick(View v) { 
       // Do something 
      } 
     }); 

    } 

    @Override 
    public int getItemCount() { 
     return entries.size(); 
    } 

    public class MyViewHolder extends RecyclerView.ViewHolder { 

     TextView tvAction, tvDate; 
     ImageView ivIcon; 

     public MyViewHolder(View itemView) { 
      super(itemView); 
      tvAction = (TextView) itemView.findViewById(R.id.tvAction); 
      tvDate = (TextView) itemView.findViewById(R.id.tvDate); 
      ivIcon = (ImageView) itemView.findViewById(R.id.ivIcon); 
     } 
    } 
} 

그리고 내 LogEntry.java :

public class LogEntry { 

    public String action; 
    public Date date; 
    public int icon; 
    public String message; 

    public LogEntry() {} 

    public LogEntry(String action, Date date, int icon, String message) { 
     this.action = action; 
     this.date = date; 
     this.icon = icon; 
     this.message = message; 
    } 
} 

누군가 여기

public class LogFragment extends Fragment { 

    private RecyclerView recyclerView; 
    private RecyclerView.Adapter rvAdapter; 
    private RecyclerView.LayoutManager rvLayoutManager; 
    private ArrayList<LogEntry> entries; 

    private DatabaseReference databaseReference; 
    private DatabaseReference logReference; 
    private FirebaseAuth firebaseAuth; 
    private FirebaseUser firebaseUser; 

    public LogFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_log, container, false); 

     databaseReference = FirebaseDatabase.getInstance().getReference(); 
     firebaseAuth = FirebaseAuth.getInstance(); 
     firebaseUser = firebaseAuth.getCurrentUser(); 

     loadEntries(); 

     recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView); 
     rvLayoutManager = new LinearLayoutManager(getActivity()); 
     recyclerView.setLayoutManager(rvLayoutManager); 

     rvAdapter = new RvAdapter(entries); 
     recyclerView.setAdapter(rvAdapter); 

     // Inflate the layout for this fragment 
     return rootView; 
    } 

    private void loadEntries(){ 
     entries = new ArrayList<>(); 
     logReference = databaseReference.child("log").child(firebaseUser.getUid()); 
     ValueEventListener valueEventListener = new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       for(DataSnapshot ds : dataSnapshot.getChildren()){ 
        entries.add(ds.getValue(LogEntry.class)); 
       } 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.w("LogFragment", "loadLog:onCancelled", databaseError.toException()); 
      } 
     }; 
     logbuchReference.addValueEventListener(valueEventListener); 

    } 
} 

그리고 나의 RvAdapter.java입니다 무슨 문제인지 알아?

편집 :

난 직후의 ArrayList를 System.out.prinln 내가 데이터를 얻을 수()에 대한. 따라서 데이터베이스에서 데이터를로드하는 중입니다. 그러나 데이터를 제시하는 것은 효과가 없습니다.

답변

3

파이어베이스가 비동기입니다. 콜백 내에서 어댑터를 설정하거나 알립니다.

ValueEventListener valueEventListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      for(DataSnapshot ds : dataSnapshot.getChildren()){ 
       entries.add(ds.getValue(LogEntry.class)); 
      } 

      // Declare adapter and set here 

      // OR... adapter.notifyDataSetChanged(); 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.w("LogFragment", "loadLog:onCancelled", databaseError.toException()); 
     } 
    }; 
보다 상세하게

,

loadEntries(); // ... Doing stuff in the background 

    recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView); 
    rvLayoutManager = new LinearLayoutManager(getActivity()); 
    recyclerView.setLayoutManager(rvLayoutManager); 

    rvAdapter = new RvAdapter(entries); // This is still empty, probably 
    recyclerView.setAdapter(rvAdapter); 

    // entries.add() called later, but adapter never notified 
1

이 문제를 해결하기 위해 https://github.com/firebase/FirebaseUI-Android을 사용할 수 있습니다.

은 ...

ListView messagesView = (ListView) findViewById(R.id.messages_list); 

DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); 

mAdapter = new FirebaseListAdapter<Chat>(this, Chat.class, android.R.layout.two_line_list_item, ref) { 
    @Override 
    protected void populateView(View view, Chat chatMessage, int position) { 
     ((TextView)view.findViewById(android.R.id.text1)).setText(chatMessage.getName()); 
     ((TextView)view.findViewById(android.R.id.text2)).setText(chatMessage.getText()); 

    } 
}; 
messagesView.setAdapter(mAdapter); 

행운을 당신을 도울 약간의 규정을 따르십시오!

관련 문제