У меня действительно странная проблема с моим приложением, это TabLayout с 3 фрагментами, 1-й и 3-й имеют RecyclerView, который заполнен базой данных Firebase, но вы не сможете увидеть информацию, пока не нажмете 1-й и 3-йВкладка, я не знаю, хорошо ли я объясняю, когда вы начинаете задание, и вы находитесь в 1-м фрагменте, ничего не отображается, вы можете перейти ко 2-му, а затем 1-му, и все равно ничего не показывается, но как только вы перейдете к 3-муи затем вернитесь к 1-му, 1-му и 3-му окнам, которые могут быть проблемой, вот мой код:
Это мои 2 фрагмента:
public class FragGastos extends Fragment implements View.OnClickListener, AdapterDinero.OnItemClickListener{
private static final String TAG = "SDSADSDS";
private Button btAdd;
private FirebaseAuth auth = FirebaseAuth.getInstance();
private GastosService gastosService;
private ArrayList<Dinero> dineros;
private RecyclerView recyclerView;
private AdapterDinero adapter;
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag_gastos_layout, container, false);
FirebaseUser user = auth.getCurrentUser();
gastosService = GastosService.getInstance(user.getDisplayName());
dineros = gastosService.getDineros();
adapter = new AdapterDinero(getContext());
adapter.setOnItemClickListener(this);
recyclerView = view.findViewById(R.id.rv_Gastos);
adapter.setDineros(dineros);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false));
btAdd = view.findViewById(R.id.bt_add_gasto);
btAdd.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), AddActivity.class);
startActivity(intent);
}
@Override
public void onItemClick(View view, int position) {
Intent intent = new Intent(getActivity(), DetalleActivity.class);
Log.w(TAG, "HA PETADO AQUI");
intent.putExtra("objDinero", dineros.get(position));
startActivity(intent);
}
}
public class FragIngresos extends Fragment implements View.OnClickListener {
private Button btAdd;
private FirebaseAuth auth;
private IngresosService ingresosService;
private ArrayList<Dinero> dineros;
private RecyclerView recyclerView;
private AdapterDinero adapter;
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag_ingresos_layout, container, false);
auth = FirebaseAuth.getInstance();
FirebaseUser user = auth.getCurrentUser();
ingresosService = IngresosService.getInstance(user.getDisplayName());
dineros = ingresosService.getDineros();
adapter = new AdapterDinero(getContext());
recyclerView = view.findViewById(R.id.rvIngresos);
recyclerView.setAdapter(adapter);
adapter.setDineros(dineros);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false));
btAdd = view.findViewById(R.id.bt_add_gasto);
btAdd.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), AddActivity.class);
startActivity(intent);
}
}
Вотадаптер, который одинаков для обоих фрагментов:
public class AdapterDinero extends RecyclerView.Adapter<AdapterDinero.DineroViewHolder> {
public interface OnItemClickListener
{
void onItemClick(View view, int position);
}
private ArrayList<Dinero> dineros;
private Context context;
private OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener)
{
this.onItemClickListener = onItemClickListener;
}
public AdapterDinero(Context context) {
this.context = context;
}
public void setDineros(ArrayList<Dinero> dineros) {
this.dineros = dineros;
notifyDataSetChanged();
}
@NonNull
@Override
public DineroViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.item_dinero, viewGroup, false);
return new DineroViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final DineroViewHolder dineroViewHolder, final int i) {
Dinero dinero = dineros.get(i);
dineroViewHolder.AsignarDatos(dinero);
}
@Override
public int getItemCount() {
if(dineros != null){
return dineros.size();
}
else{
return 0;
}
}
public class DineroViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView tvTitulo, tvDinero;
public DineroViewHolder(@NonNull View itemView) {
super(itemView);
tvTitulo = itemView.findViewById(R.id.tv_itemDinero_titulo);
tvDinero = itemView.findViewById(R.id.tv_itemDinero_Precio);
itemView.setOnClickListener(this);
}
public void AsignarDatos(Dinero dinero){
String total = String.valueOf(dinero.getTotal())+ "€";
tvDinero.setText(total);
tvTitulo.setText(dinero.getNombre());
}
@Override
public void onClick(View v) {
if ( onItemClickListener != null ){
onItemClickListener.onItemClick(this.itemView, this.getAdapterPosition() );
}
}
}
}
И, наконец, у меня есть 2 класса для заполнения фрагментов:
public class GastosService {
private ArrayList<Dinero> dineros;
public static GastosService gastosService;
public static GastosService getInstance(String username){
if(gastosService == null){
gastosService = new GastosService(username);
}
return gastosService;
}
private GastosService(String userName){
FirebaseRead firebaseOperation = new FirebaseRead();
firebaseOperation.getGastos(userName, new FirebaseRead.GastosLoaded() {
@Override
public void gastosIsLoaded(ArrayList<Dinero> gastos) {
dineros = gastos;
}
});
}
public ArrayList<Dinero> getDineros() {
return dineros;
}
public Dinero getDinero(int i){
return dineros.get(i);
}
}
public class IngresosService {
private ArrayList<Dinero> dineros;
public static IngresosService ingresosService;
public static IngresosService getInstance(String username){
if(ingresosService == null){
ingresosService = new IngresosService(username);
}
return ingresosService;
}
private IngresosService(String userName){
FirebaseRead firebaseOperation = new FirebaseRead();
firebaseOperation.getIngresos(userName, new FirebaseRead.IngresosIsLoaded() {
@Override
public void ingresosIsLoaded(ArrayList<Dinero> ingresos) {
dineros = ingresos;
}
});
}
public ArrayList<Dinero> getDineros() {
return dineros;
}
public Dinero getDinero(int i){
return dineros.get(i);
}
}
И вот функциякласса, который получает чтение базы данных:
public class FirebaseRead {
private static final String TAG1 = "Operacion de lectura";
private FirebaseDatabase database = FirebaseDatabase.getInstance();
private ArrayList<Dinero> beneficio;
private ArrayList<Dinero> gastos;
float total;
public interface GastosLoaded{
void gastosIsLoaded(ArrayList<Dinero> gastos);
}
public interface IngresosIsLoaded{
void ingresosIsLoaded(ArrayList<Dinero> ingresos);
public void getGastos(String user, GastosLoaded gLoaded ){
gastos = new ArrayList<>();
final GastosLoaded gastosLoaded = gLoaded;
DatabaseReference ref = database.getReference().child("Users").child(user).child("Gastos");
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
gastos.clear();
for(DataSnapshot ds : dataSnapshot.getChildren()){
String nombreAux = ds.child("nombre").getValue().toString();
String descAux = ds.child("descripcion").getValue().toString();
String fecha = ds.child("fecha").getValue().toString();
int precioAux = Integer.parseInt(ds.child("total").getValue().toString());
Dinero dinero = new Dinero(nombreAux, descAux,precioAux, fecha);
dinero.setId(ds.getKey());
gastos.add(dinero);
}
gastos = ordenaDinero(gastos);
gastosLoaded.gastosIsLoaded(gastos);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
public void getIngresos(String user, IngresosIsLoaded iLoaded){
beneficio = new ArrayList<>();
final IngresosIsLoaded ingresosIsLoaded = iLoaded;
DatabaseReference ref = database.getReference().child("Users").child(user).child("Ingresos");
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
beneficio.clear();
for(DataSnapshot ds : dataSnapshot.getChildren()){
String nombreAux = ds.child("nombre").getValue().toString();
String descAux = ds.child("descripcion").getValue().toString();
String fecha = ds.child("fecha").getValue().toString();
int precioAux = Integer.parseInt(ds.child("total").getValue().toString());
Dinero dinero = new Dinero(nombreAux, descAux,precioAux, fecha);
dinero.setId(ds.getKey());
beneficio.add(dinero);
}
beneficio = ordenaDinero(beneficio);
ingresosIsLoaded.ingresosIsLoaded(beneficio);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
Я знаю, что это много кода, но я пытаюсь найти решение много времени, и ничего не работает, пожалуйста, помогите!