Мое приложение, подключенное к firebase, не настраивает recyclerView при инициализации действия - PullRequest
0 голосов
/ 30 мая 2019

У меня действительно странная проблема с моим приложением, это 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) {

        }
    });
}

Я знаю, что это много кода, но я пытаюсь найти решение много времени, и ничего не работает, пожалуйста, помогите!

1 Ответ

0 голосов
/ 30 мая 2019
dineros = ingresosService.getDineros();
adapter = new AdapterDinero(getContext());
recyclerView = view.findViewById(R.id.rvIngresos);
recyclerView.setAdapter(adapter); // after
adapter.setDineros(dineros); // 1st

Вы notifyDataChange() в вашем AdapterDinero?

Может быть, мы увидим, будет ли эта работа первой:

вызов adapter.setDineros(dineros); сначала

изатем recyclerView.setAdapter(adapter);

не забывайте notifyDataChange() каждый раз, когда вы обновляете свой контент.

Обновление:

RecyclerView обычно не имеет контента, потому что егоdataSet пуст.Я предлагаю поставить какой-нибудь журнал, чтобы посмотреть, что произошло.

Поскольку вы загрузили свой адаптер, я обнаружил, что

public void setDineros(ArrayList<Dinero> dineros) {
  this.dineros = dineros; << not good.
  notifyDataSetChanged();
}

Существует небольшое недопонимание относительно notifyDataSetChanged(), это означает, что ОРИГИНАЛ набор данных (arrayList) был изменен.

Ваш адаптер запоминает только ссылку на первый узел исходного ArrayList, вы передали новый DataSet, но исходный arrayList ничего не знал.

Правильный путь: arrayList.add()/remove()/clear()/addAll(), а затем notify(), вот как мы изменяем ОРИГИНАЛЬНЫЙ набор данных.

, например:

public void setDineros(ArrayList<Dinero> dineros) {
    this.dineros.clear()
    this.dineros.addAll(dineros)
    notifyDataSetChanged();
}

Не следует заменять весь массивList, потому чтоэтот новый arrayList не является исходным arrayList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...