android - firebaserecycleradapter() no se puede aplicar a FirebaseRecyclerAdapter
firebase-realtime-database firebaseui (5)
¿Alguien puede decir cuál es el error en esa línea específica?
Aquí está el mensaje de error que se muestra.
package com.example.souravkumar.sqaurewallpapers;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.squareup.picasso.Picasso;
/**
* Created by Sourav Kumar on 11/3/2017.
*/
public class popular extends AppCompatActivity {
private RecyclerView recyclerView;
private DatabaseReference myRef;
@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
myRef = FirebaseDatabase.getInstance().getReference();
FirebaseRecyclerAdapter<image_details, BlogViewHolder> adapter = new FirebaseRecyclerAdapter<image_details, BlogViewHolder>(
image_details.class,
R.layout.individual_row,
myRef) {
@Override
protected void onBindViewHolder(BlogViewHolder holder, int position, image_details model) {
holder.setDate(model.getDate());
holder.setUrl(model.getUrl());
}
@Override
public BlogViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
};
recyclerView.setAdapter(adapter);
}
public static class BlogViewHolder extends RecyclerView.ViewHolder {
TextView textView;
ImageView imageView;
public BlogViewHolder(View itemView) {
super(itemView);
textView = (TextView)itemView.findViewById(R.id.date);
imageView = (ImageView)itemView.findViewById(R.id.imageView);
}
public void setDate(Long date) {
textView.setText(date.toString());
}
public void setUrl(String url) {
Picasso.with(itemView.getContext())
.load(url)
.resize(50, 50)
.centerCrop()
.into(imageView);
}
}
}
Esta es la manera correcta :
FirebaseRecyclerOptions<image_details> options =
new FirebaseRecyclerOptions.Builder<image_details>()
.setQuery(myRef, image_details.class)
.build();
FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<image_details, BlogViewHolder>(options) {
@Override
public BlogViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.individual_row, parent, false);
return new BlogViewHolder(view);
}
@Override
protected void onBindViewHolder(BlogViewHolder holder, int position, image_details model) {
// Bind the image_details object to the BlogViewHolder
// ...
}
};
Hola, tu error se debe a un argumento que falta en estos () que se encuentran junto a este
<image_details, BlogViewHolder>
entonces te perdiste un argumento más de tu clase BlogViewHolder, así que agregaré el fragmento de código y referiré tu argumento faltante con un comentario en esto:
FirebaseRecyclerAdapter<image_details, BlogViewHolder> adapter = new FirebaseRecyclerAdapter<image_details, BlogViewHolder>(
image_details.class,
R.layout.individual_row,
BlogViewHolder.class //see this is missing so you should add it
myRef) {
La última versión (3.x) de FirebaseUI implementa un método diferente de inicializar un
FirebaseRecyclerAdapter
que las versiones anteriores.
Del
uso de la documentación de FirebaseRecyclerAdapter
:
Primero, configure el adaptador creando
FirebaseRecyclerOptions
. En este caso continuaremos con nuestro ejemplo de chat:
FirebaseRecyclerOptions<Chat> options = new FirebaseRecyclerOptions.Builder<Chat>() .setQuery(query, Chat.class) .build();
Luego cree el objeto
FirebaseRecyclerAdapter
. Ya debería tener una subclaseViewHolder
para mostrar cada elemento.
Entonces, para su ejemplo, deberá hacer algo similar a:
FirebaseRecyclerOptions<image_details> options =
new FirebaseRecyclerOptions.Builder<image_details>()
.setQuery(myRef, image_details.class)
.build();
FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<image_details, BlogViewHolder>(options) {
@Override
public BlogViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.individual_row, parent, false);
return new BlogViewHolder(view);
}
@Override
protected void onBindViewHolder(BlogViewHolder holder, int position, image_details model) {
// Bind the image_details object to the BlogViewHolder
// ...
}
};
Finalmente,
FirebaseRecyclerAdapter
usa un detector de eventos para monitorear los cambios en la consulta de Firebase.
Para comenzar a escuchar datos, llame a
adapter.startListening()
y
adapter.stopListening()
para detener el escucha.
Se recomienda llamar a estos en
onStart()
y
onStop()
respectivamente.
Más detalles sobre esto están disponibles en la
documentación del ciclo de vida de FirebaseRecyclerAdapter
.
Te perdiste un método para comenzar la actividad.
Agregue esto en el método
onStart()
:
firebaseRecyclerAdapter.startListening();
Tuve el mismo error y esto funcionó muy bien para mí. Espero que ayude a alguien
//loads data into recycler view onstart up
@Override
protected void onStart() {
super.onStart();
FirebaseRecyclerOptions<Data> options =
new FirebaseRecyclerOptions.Builder<Data>()
.setQuery(dbReference, Data.class)
.build();
FirebaseRecyclerAdapter firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Data, DataViewHolder>(options) {
@Override
public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.row, parent, false);
return new DataViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull DataViewHolder holder, int position, @NonNull Data model) {
// Bind the image_details object to the BlogViewHolder
// ...
holder.setDetails(getApplicationContext(), model.getName(), model.getDepartment(), model.getDescription());
}
};
firebaseRecyclerAdapter.startListening();
recyclerView.setAdapter(firebaseRecyclerAdapter);
}