java - guardar - recuperar datos firebase web
Los datos no se cargaron correctamente en la aplicaciĆ³n de Firebase (1)
Todo el código que ha escrito en onCreateView
debe escribirse onViewCreated
.
Es mejor hacer cualquier asignación de subvistas a los campos en onViewCreated. Esto se debe a que el marco realiza una comprobación automática nula para garantizar que la jerarquía de vistas de Fragment se haya creado e inflado.
public class FragmentHome extends Fragment {
private SearchView search;
View v;
DatabaseReference dataRef;
private FirebaseListAdapter<String> firebaseListAdapter;
ListView mListView;
private TextView text;
ArrayList<String> city=new ArrayList<String>();
private int i=0;
private String data,val,var;
ArrayAdapter<String> adapter;
ProgressBar progressBar;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable final Bundle savedInstanceState) {
v = inflater.inflate(R.layout.activity_fragment_home,container,false);
if (container!=null){
container.removeAllViews();
}
return v;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
progressBar= (ProgressBar) v.findViewById(R.id.search_pro);
search= (SearchView) v.findViewById(R.id.search);
search.onActionViewExpanded();
search.setIconified(false);
search.setInputType(InputType.TYPE_NULL);
search.setQueryHint("Search Docter By City Or Department");
mListView= (ListView) v.findViewById(R.id.mList);
mListView.setVisibility(View.INVISIBLE);
dataRef=FirebaseDatabase.getInstance().getReference().child("Docters");
adapter=new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, city);
mListView.setAdapter(adapter);
adapter.notifyDataSetChanged();
dataRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
data=dataSnapshot.child("city").getValue(String.class);
val=dataSnapshot.child("department").getValue(String.class);
if (!city.contains(data)){
city.add(data);
}
if (!city.contains(val)){
city.add(val);
}
search.setInputType(InputType.TYPE_CLASS_TEXT);
progressBar.setVisibility(View.GONE);
adapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
data=dataSnapshot.child("city").getValue(String.class);
val=dataSnapshot.child("department").getValue(String.class);
city.add(data);
city.add(val);
city.add(var);
adapter.notifyDataSetChanged();
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String text) {
return false;
}
@Override
public boolean onQueryTextChange(String text) {
if (!text.isEmpty()){
adapter.notifyDataSetChanged();
mListView.setVisibility(View.VISIBLE);
adapter.getFilter().filter(text);
}else{
mListView.setVisibility(View.INVISIBLE);
}
return false;
}
});
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String itemRef = (String) adapter.getItem(position);
search.setVisibility(View.INVISIBLE);
mListView.setVisibility(View.INVISIBLE);
FragmentTransaction ft=getChildFragmentManager().beginTransaction();
DocterList fragment=new DocterList();
Bundle item=new Bundle();
item.putString("item",itemRef);
fragment.setArguments(item);
ft.replace(R.id.activity_fragment_home,fragment);
ft.addToBackStack(null);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
});
}
progressBar= (ProgressBar) v.findViewById(R.id.search_pro);
==> la vista solo aparecerá en onViewCreated
Creé una aplicación usando firebase en android studio. Aparecerá una búsqueda después de la autenticación con otp móvil. Cuando la búsqueda del usuario en la vista de búsqueda filtrará los resultados, irá a una vista del reciclador, y así sucesivamente. Por primera vez, la aplicación de actividad (es decir, actividad hogareña después de la autenticación) funciona perfectamente.
Pero mi problema es que mi aplicación no cargó datos después de un tiempo más tarde. También otros campos, incluida la vista de búsqueda, tampoco funcionaron. Además, la aplicación funciona después de cerrar la sesión e iniciar sesión de nuevo en la aplicación después de que haya ocurrido este problema.
Alguien sabe como arreglarlo?
public class FragmentHome extends Fragment {
private SearchView search;
View view;
DatabaseReference dataRef;
private FirebaseListAdapter<String> firebaseListAdapter;
ListView mListView;
private TextView text;
ArrayList<String> city=new ArrayList<String>();
private int i=0;
private String data,val,var;
ArrayAdapter<String> adapter;
ProgressBar progressBar;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable final Bundle savedInstanceState) {
View v= inflater.inflate(R.layout.activity_fragment_home,container,false);
if (container!=null){
container.removeAllViews();
}
progressBar= (ProgressBar) v.findViewById(R.id.search_pro);
search= (SearchView) v.findViewById(R.id.search);
search.onActionViewExpanded();
search.setIconified(false);
search.setInputType(InputType.TYPE_NULL);
search.setQueryHint("Search Docter By City Or Department");
mListView= (ListView) v.findViewById(R.id.mList);
mListView.setVisibility(View.INVISIBLE);
dataRef=FirebaseDatabase.getInstance().getReference().child("Docters");
adapter=new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, city);
mListView.setAdapter(adapter);
adapter.notifyDataSetChanged();
dataRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
data=dataSnapshot.child("city").getValue(String.class);
val=dataSnapshot.child("department").getValue(String.class);
if (!city.contains(data)){
city.add(data);
}
if (!city.contains(val)){
city.add(val);
}
search.setInputType(InputType.TYPE_CLASS_TEXT);
progressBar.setVisibility(View.GONE);
adapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
data=dataSnapshot.child("city").getValue(String.class);
val=dataSnapshot.child("department").getValue(String.class);
city.add(data);
city.add(val);
city.add(var);
adapter.notifyDataSetChanged();
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String text) {
return false;
}
@Override
public boolean onQueryTextChange(String text) {
if (!text.isEmpty()){
adapter.notifyDataSetChanged();
mListView.setVisibility(View.VISIBLE);
adapter.getFilter().filter(text);
}else{
mListView.setVisibility(View.INVISIBLE);
}
return false;
}
});
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String itemRef = (String) adapter.getItem(position);
search.setVisibility(View.INVISIBLE);
mListView.setVisibility(View.INVISIBLE);
FragmentTransaction ft=getChildFragmentManager().beginTransaction();
DocterList fragment=new DocterList();
Bundle item=new Bundle();
item.putString("item",itemRef);
fragment.setArguments(item);
ft.replace(R.id.activity_fragment_home,fragment);
ft.addToBackStack(null);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
});
return v;
}
}