初始化活动时,连接到Firebase的我的应用程序未设置recyclerView

时间:2019-05-30 00:12:50

标签: android firebase android-fragments android-recyclerview

我的应用程序确实存在一个奇怪的问题,它是一个TabLayout,其中第一个包含3个片段,第三个包含一个RecyclerView,其中填充了Firebase数据库,但是直到您单击第一个和第三个,您才能看到该信息标签,我不知道我是否解释得很好,当您开始活动时,您在第一个片段中,什么都没有显示,您可以转到第二个,然后到第一个片段,仍然没有任何显示,但是一旦您进入第三个然后回到第1个,第1个和第3个recyclerview被填充,这可能是问题所在,这是我的代码:

这些是我的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 :(得分:0)

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

您不应替换整个arrayList,因为新的arrayList不是原始的arrayList。