1

Kann ich den Adapter benachrichtigen, um die Abfrage zu ändern? Wie jetzt tut es nichts ... irgendjemand?Weiß jemand, ob Firebase den Adapter gegen eine Abfrage benachrichtigen kann.

05-28 17: 04: 07.358 15.585 bis 15.674/com.example.rasmusjosefsson.rjcar D/OpenGLRenderer: endAllStagingAnimators auf 0x7ff46e405c00 (ListPopupWindow $ DropDownListView) mit Griff 0x7ff46f3d1b00

onCreate()

private DatabaseReference mUserRef; 
private String mTravelTypeSelected; 
private Query queryRefSelected; 
private FirebaseRecyclerAdapter<MyWaypoint, LatLngViewHolder> mFirebaseRecyclerViewAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_list); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayShowTitleEnabled(false); 

    //*************** TRAVEL SPINNER**************// 
    mSpinnerTravelType = (Spinner) findViewById(R.id.spinner_nav); 

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
      R.array.traveltype_array, R.layout.spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

    mSpinnerTravelType.setAdapter(adapter); 

    mSpinnerTravelType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 

      if (position == 0) { 
       queryRefSelected = mUserRef; 
      } else if (position == 1) { 
       queryRefSelected = mUserRef.orderByChild("travelType").equalTo("Work"); 
       mTravelTypeSelected = "Work"; 
       Log.i("TEST", position + " "); 

      } else if (position == 2) { 
       queryRefSelected = mUserRef.orderByChild("travelType").equalTo("Private"); 
       Log.i("TEST", position + " "); 
      } 
      mFirebaseRecyclerViewAdapter.notifyDataSetChanged(); 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 

     } 
    }); 

    recyclerView = (RecyclerView) findViewById(R.id.card_recycler_view); 
    recyclerView.setHasFixedSize(false); 
    LinearLayoutManager manager = new LinearLayoutManager(this); 
    manager.setReverseLayout(false); 
    recyclerView.setLayoutManager(manager); 
} 

RecyclerViewAdapter

private void attachRecyclerViewAdapter() { 

    mFirebaseRecyclerViewAdapter = new FirebaseRecyclerAdapter<MyWaypoint, LatLngViewHolder>(MyWaypoint.class, R.layout.list_item, LatLngViewHolder.class, queryRefSelected) { 
     @Override 
     protected void populateViewHolder(final LatLngViewHolder latLngViewHolder, MyWaypoint item, final int i) { 

      Log.i("SELECTED INSIDE POP", queryRefSelected.toString()); 

      String locA = item.getOrigin(); 
      latLngViewHolder.locationA.setText(locA); 

      String locB = item.getDestination(); 
      latLngViewHolder.locationB.setText(locB); 

      String distance = item.getDistance(); 
      latLngViewHolder.distance.setText(distance); 

      final String duration = item.getDuration(); 

     } 
    }; 
    recyclerView.setAdapter(mFirebaseRecyclerViewAdapter);  
} 

onStart

@Override 
public void onStart() { 
    super.onStart(); 
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    if (user != null) { 

     // User is signed in 
     String mUserId = user.getUid(); 

     // String userUrl = Constants.FIREBASE_URL + "https://stackoverflow.com/users/" + mUserId + "/waypoints"; 
     String userUrl = "https://rjcar3.firebaseio.com/users/lP1K8Ik0zrhaXD6AR6C0x7ozi5g2/waypoints"; 
     mUserRef = FirebaseDatabase.getInstance().getReferenceFromUrl(userUrl); 

     // Set standard query 
     queryRefSelected = mUserRef; 

     // attaching the adapter 
     attachRecyclerViewAdapter(); 
    } 
} 

Antwort

2

Sie mFirebaseRecyclerViewAdapter.notifyDataSetChanged() fordern, die nur die RecyclerView sagen die Ansichten auffrischen es bereits.

Wenn Sie die zugrunde liegende Abfrage des Adapters ändern möchten, müssen Sie erneut attachRecyclerViewAdapter() aufrufen, um den Adapter mit einem neuen Query neu zu erstellen. Wenn Sie dies tun, achten Sie darauf, mFirebaseRecyclerViewAdapter.cleanup() auf dem alten Adapter aufzurufen.

+0

ohh ich sehe, Vielen Dank! –

+0

Offtopic: Ist es möglich, zwei Abfragen zu kombinieren? Monat ausgewählt (12 Artikel) und Reisetyp (2 Artikel). Oder ist es besser, es anders in der Datenbank zu speichern, einen Knoten für private und einen für die Arbeit? –

+0

Sie können nur eine Abfrage verwenden. Es ist immer besser, Ihre Daten in der Datenbank so aussehen zu lassen, wie Sie sie abfragen möchten, anstatt komplexe Dinge auf der Client-Seite auszuführen. Es reduziert den Download-Betrag und macht Ihre App schneller. –