2017-12-04 1 views
1

상황 : 목록보기에 클래스 목록이 있습니다. 괜찮 았어. 나는이 같은 목록에서 클래스를 검색 할 수 있어요 :중복 된 이름에서 하나의 값을 얻으려면 어떻게해야합니까?

English 
Math 
French 

이 클래스의 데이터베이스입니다 : 목록 항목을 클릭하면, 이제

enter image description here

, 내가 보여주고 싶은 섹션을 클릭하면 English 목록 항목을 클릭하면 해당 클래스 섹션에 경고 대화 상자가 표시됩니다. 나는 이런 식으로 그렇게 할 수 있어요 :

listclasses.setLongClickable(true); 

listclasses.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
    @Override 
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
     final String selectedFromList = (String) listclasses.getItemAtPosition(position); 
     final DatabaseReference retriev = FirebaseDatabase.getInstance().getReference().child("Class"); 
     retriev.orderByChild("Classname").equalTo(selectedFromList).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for(DataSnapshot data: dataSnapshot.getChildren()){ 

        String key=data.getKey(); 

        DatabaseReference referes=FirebaseDatabase.getInstance().getReference().child("Class"); 
        referes.orderByKey().equalTo(key).addListenerForSingleValueEvent(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          for(DataSnapshot datas: dataSnapshot.getChildren()){ 

          String section=datas.child("section").getValue().toString(); 

          LayoutInflater li = LayoutInflater.from(StudentSearchActivity.this); //inflate converts xml to a view object to use in code 
          View promptsView = li.inflate(R.layout.info, null); //two parameters, the xml and the root(null means the layout is a child of viewgroup 

          AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
            StudentSearchActivity.this); /*alertdialog.builder class,creates a builder for alert dialog, parameter is context */ 

          alertDialogBuilder.setView(promptsView); 
          final TextView sections = (TextView) promptsView.findViewById(R.id.sections); 
          sections.setText(section); 
          alertDialogBuilder.setCancelable(true); //true can be canceled with back key 
          alertDialogBuilder.setPositiveButton("Ok", 
            new DialogInterface.OnClickListener() { 
             public void onClick(DialogInterface dialog, int id) { 
              dialog.dismiss(); 
             } 
            }); 
          AlertDialog alertDialog = alertDialogBuilder.create(); //creates alert dialog from builder 
          alertDialog.show(); 
         }} 

문제 : 내가 같은 클래스 이름 예 English을 가지고 있지만 각자가 섹션에있을 때, 나는 항목의 긴 클릭에 모두의 섹션을 얻을. 예 :

1 단계 : English 항목을 길게 클릭합니다.

2 단계 : 503 섹션의 경고 대화 상자가 나타납니다.

3 단계 : 뒤로 또는 ok을 누르면 섹션이있는 다른 경고 대화 상자가 나타납니다.

두 섹션 모두 같은 이름이므로 하나의 클래스를 길게 클릭하면 나타나지만 잘못된 것입니다. 해당 영어 수업의 섹션 만 표시되어야하며 다른 영어 수업을 클릭하면이 영어 수업의 섹션도 표시됩니다. Firebase에서이를 해결할 수 있습니까?

저는 addListenerForSingleValueEvent을 사용 중이며 데이터베이스에도 코드와 마찬가지로 Classname입니다.

+0

입니까? –

+0

Im 해결할 수 있는지 묻고 있습니까? 그리고 어떻게? 난 그저 중복 된 이름을 길게 클릭해서 그 섹션을 보이기를 원합니다. –

+0

목록에 하나의 "영어"를 표시 하시겠습니까 ??? –

답변

0

listclasses의 값을 하드 코드 한 다음이 값을 사용하여 Class 중 하나를 쿼리하면 여러 명의 자식이 나타날 수 있습니다. 스크린 샷을 기준으로 classname에 대해 동일한 값을 포함하는 두 개의 하위 항목이 있기 때문입니다.

당신은 Class 노드에 리스너를 부착 한 후 데이터베이스의 값을 기준으로 listclasses를 채우는 한 다음 자신의 section 값을 가지는 AlertDialog를 보여줍니다 그들의 각 하나에 OnClickListener 또는 OnLongItemClickListener을 설정해야합니다.

다음은 솔루션 그래서 당신은이 경우에 수행 할 작업을

// to store the class's value 
List<Class> classes = new ArrayList<>(); 

// to retrieve the list of class from the database 
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Class"); 
ref.addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     Class class = dataSnapshot.getValue(Class.class); 
     classes.add(class); 

     ... add 'class.getClassName()' to the listclasses adapter 
    } 
}); 

// add the OnItemLongClickListener 
listclasses.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
    @Override 
    public boolean onItemLongClick(AdapterView <<?>parent, View view, int position, long id) { 
     Class selectedClass = classes.get(position); 

     ... show an AlertDialog with the value of 'selectedClass.getSection()' 
    } 
}); 
+0

그게 무슨 일을하고, 데이터베이스에서'listclasses'을 채우지 만 모델 클래스를 사용하지 않으므로 String 클래스 메쏘드를 사용하고 있습니다. classnames = dataSnapshot.child ("Classname"). getValue(). toString(); 그런 다음 listofclasses.add (클래스 이름); –

+0

나는 그것이 단지 나던 일이라고 생각한다. –

관련 문제