2017-11-07 1 views
1

나는 recylerviews 및 Firebase로 작업하고 있습니다. FirebaseUI를 사용하여 데이터를 내 recyclerview에 채 웁니다. 내 조각 내에서 두 개의 쿼리를 사용할 수 있는지 궁금합니다. 실행해야하는 쿼리는 데이터베이스의 노드가 존재하는지 여부에 따라 달라야합니다.Android - recyclerview (Firebase)에 대한 여러 검색어

데이터베이스 구조는 다음 주소 아이가 사용자에 존재

enter image description here

경우 노드, 나의 조각은 사용자 노드를 조회해야한다. 그렇지 않으면 라우트 노드를 조회해야합니다. 이것이 가능한가?

기본적으로 여기에 내가 만드는 중이라서 나에게 모든 마커를 가져옵니다의 요청에 의한 :

Query keyQuery = FirebaseDatabase.getInstance().getReference(sharedPreferences.getString("school", null)).child("markers"); 
    recyclerView = (RecyclerView) rootView.findViewById(R.id.markerRecyclerview); 
    recyclerView.setHasFixedSize(true); 
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 

    FirebaseRecyclerOptions<FirebaseMarker> options = new FirebaseRecyclerOptions.Builder<FirebaseMarker>() 
      .setQuery(keyQuery, FirebaseMarker.class) 
      .build(); 

내 onBindViewHolder 방법 내부는 내가 recyclerview의 각 항목에 온 클릭이있다. 항목을 클릭하면 사용자가 새 활동으로 이동합니다. 이 새로운 활동에서 사용자는 users/userId 노드 아래에 주소 노드를 추가하는 버튼을 누를 수 있습니다. 그 버튼을 누르는 것은 사용자가 마커를 선택했다는 것을 의미합니다. 그래서 마커 정보를 데이터베이스의 모든 마커가 아닌 recyclerview에만 표시하려고합니다.

holder.mView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Intent intent = new Intent(getActivity(),MainActivity.class); 
        intent.putExtra("databaseKey", key); 
        startActivity(intent); 
       } 
      }); 

것은 그 생각하십시오 주소시간 노드가 사용자 노드에 삽입 된 경우, 그냥 쉽게 만들 것이다,이를 조회 할 수 있습니다.

+0

그래서 현재 사용자의 노드 아래에'address'가 있는지에 따라 다른 쿼리를'FirebaseRecyclerAdapter'에 붙이시겠습니까? 이것이 일어날 수있는 몇 가지 예제 코드를 제공 할 수 있습니까? 다른'FirebaseRecyclerOptions' 인스턴스로 어댑터를 초기화 할 수 있어야합니다. – Grimthorr

+0

내 게시물을 업데이트했습니다. 그것은 의미가 있습니까? – JDoe

+0

가능하다고 생각하십니까? – JDoe

답변

1

사용자가 마커를 선택했는지 확인한 다음 FirebaseRecyclerAdapter에 첨부 할 쿼리를 결정해야한다고 생각할 수도 있지만 가능합니다. ,

users 
    userId 
    selectedMarker  // the ID of the marker selected by this user 
    ... 
markers 
    markerId 
    ... 
    selectedUsers  // list of user IDs that have selected this marker 

는 다음, users 노드가 selectedMarker 값이 포함 된 경우 :

, 가능성이 마커 노드에서 각 마커를 선택한 사용자의 목록을 추가 할 필요가있을 것 같은 것을 그렇게하려면 schoolIdsharedPreferences.getString("school", null)userId에서입니다

Query query = FirebaseDatabase.getInstance().getReference() 
     .child(schoolId).child("markers") 
     .orderByChild("selectedUsers/"+userId).equalTo(true); 

는 현재 사용자의 로그인 한 :이 특정 사용자에 의해 선택된 모든 마커를 얻기 위해 아래 쿼리를 사용할 수 있습니다 고유 ID. 사용자가 마커를 선택한 경우

는 다음과 같이 간단 할 수 확인하려면 : 당신은 단지 사용자의 단일 선택 마커를 표시하려면

FirebaseDatabase.getInstance().getReference() 
     .child(schoolId).child("users").child(userId) 
     .addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if (dataSnapshot.child("selectedMarker").exists()) { 
        // Attach above query to FirebaseRecyclerAdapter 
       } else { 
        // Attach markers reference (no query) to FirebaseRecyclerAdapter 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) {} 
     }); 

그러나, 당신이 필요하지 않은 가능성이 높습니다에 RecyclerView을 전혀 사용하지 않고 별도의보기를 사용하여 사용자가 선택한 마커에 대한 세부 정보를 표시 할 수 있습니다.

+0

답변 해 주셔서 감사합니다.사용자의 단일 선택 마커 만 표시하면된다는 마지막 포인트가 정확하다고 보입니다. 'recylerview'를 사용하여 모든 마커를 표시하고 사용자 노드 아래에 '주소'노드가있는 경우 별도의 텍스트보기를 사용합니다. – JDoe

+0

문제는 'if-else' 문에서 databaseReference가 실행될 때 발생하는 문제입니다. , 제대로 실행되지 않습니다. – JDoe

+0

https://pastebin.com/Ks0c0LJT. 이것이 내가하는 방법이다. 나는 실수를 저질렀다. 내 화면에는 데이터가없는 채워진 행 하나가 표시됩니다. – JDoe