Tengo un NavigationDrawer actividad que se utiliza fragmentos. En uno de mis fragmentos quiero cargar los datos de la base avanzada de la base de datos a un RecyclerView.

Así que tengo un ArrayList para los objetos que se han almacenado en la base de datos. Luego añadir una ValueEventListener a mi base de datos de referencia de donde puedo agregar los objetos de la base de datos a la lista de matriz. Y luego me doy la ArrayList a RecyclerView Adaptador que debe crear la lista con mis objetos.

Cuando yo uso addListenerForSingleValueEvent nunca es trabajo, siempre tengo un vacío RecyclerView. Cuando yo uso addValueEventListener es trabajo ni en el inicio, pero cuando me cambie la orientación de mi teléfono al paisaje de los datos aparece de repente. Y si yo me vuelvo a la orientación normal es que todavía hay. Pero no al principio cuando abro el fragmento.

Aquí está mi código del fragmento de la clase:

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

Y aquí está mi RvAdapter.java:

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

Y aquí mi 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;
}
}

Alguien sabe cuál puede ser el problema?

EDICIÓN:

Cuando Me Sistema.a cabo.prinln el ArrayList a la derecha después de que el for() puedo obtener los datos. Por lo que la carga de los datos de la base de datos de trabajo. Pero la presentación de los datos no está funcionando.

InformationsquelleAutor Nono | 2017-01-12

2 Comentarios

  1. 4

    Firebase es asincrónica. Establecer o notificar el adaptador dentro de la devolución de llamada.

    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());
    }
    };

    Con más detalle,

        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
  2. 1

    Puede utilizar https://github.com/firebase/FirebaseUI-Android para resolver este problema.

    seguir un poco de código para ayudar a…

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

    Buena suerte!!!

Dejar respuesta

Please enter your comment!
Please enter your name here