2016-11-25 3 views
0

Meine JSON:Listview nicht bevölkern Daten von Firebase

{ 
    "Classes": { 
     "host101": { 
      "classID": "host101", 
      "className": "host test", 
      "days": ["monday", "wednesday", "friday"], 
      "gpsLocation": "999", 
      "roster": { 
       "7MFUgOkcQbStn1nBFsVR4ZPWbmo2": { 
        "firstName": "Student", 
        "id": "7MFUgOkcQbStn1nBFsVR4ZPWbmo2", 
        "lastName": "test1", 
        "studentEmail": "[email protected]" 
       } 
      }, 
      "startTime": "2000", 
      "teacherID": "Zb0cLGSz0YX5WYFSXPc4TJ5M8mf2" 
     } 
    }, 
    "Users": { 
     "7MFUgOkcQbStn1nBFsVR4ZPWbmo2": { 
      "Classes": { 
       "host101": { 
        "classID": "host101", 
        "className": "host test", 
        "days": ["monday", "wednesday", "friday"], 
        "startTime": "2000" 
       } 
      }, 
      "firstName": "Student", 
      "id": "7MFUgOkcQbStn1nBFsVR4ZPWbmo2", 
      "lastName": "test1", 
      "studentEmail": "[email protected]" 
     }, 
     "Zb0cLGSz0YX5WYFSXPc4TJ5M8mf2": { 
      "Hosted Classes": { 
       "host101": { 
        "classID": "host101", 
        "className": "host test", 
        "days": ["monday", "wednesday", "friday"], 
        "gpsLocation": "999", 
        "roster": { 
         "7MFUgOkcQbStn1nBFsVR4ZPWbmo2": { 
          "firstName": "Student", 
          "id": "7MFUgOkcQbStn1nBFsVR4ZPWbmo2", 
          "lastName": "test1", 
          "studentEmail": "[email protected]" 
         } 
        }, 
        "startTime": "2000", 
        "teacherID": "Zb0cLGSz0YX5WYFSXPc4TJ5M8mf2" 
       } 
      }, 
      "firstName": "Teacher", 
      "id": "Zb0cLGSz0YX5WYFSXPc4TJ5M8mf2", 
      "lastName": "test", 
      "studentEmail": "[email protected]" 
     } 
    } 
} 

Mein Code von TeacherClassDetail.class:

public class TeacherClassDetail extends AppCompatActivity { 

    //in progress. teacher will set their question here and be able to take attendance and other teacher stuff... 
    final DatabaseReference fbRef = FirebaseDatabase.getInstance().getReference(); 
    final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    Button setQuestion; 
    Button removeClass; 
    TextView tvDetailName; 
    TextView tvID; 
    TextView tvStart; 
    ListView lvDayList; 
    ArrayList<String> dList = new ArrayList<String>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_teacher_class_detail); 

     final ArrayAdapter<String> adapter = new ArrayAdapter<String> 
       (this, android.R.layout.simple_list_item_1, dList); 

     lvDayList = (ListView) findViewById(R.id.lvDays); 
     setQuestion = (Button) findViewById(R.id.bSetQuestion); 
     removeClass = (Button) findViewById(R.id.bRemoveClass); 
     tvDetailName = (TextView) findViewById(R.id.tvCDetailName); 
     tvID = (TextView) findViewById(R.id.tvCDetailID); 
     tvStart = (TextView) findViewById(R.id.tvCDetailStart); 

    } 

    protected void onStart(){ 
     super.onStart(); 

     final ArrayAdapter<String> adapter = new ArrayAdapter<String> 
       (TeacherClassDetail.this, android.R.layout.simple_list_item_1, dList); 

     lvDayList.setAdapter(adapter); 

     final String ID = getIntent().getStringExtra("ID"); 
     Query query = fbRef.child("Users").child(user.getUid()).child("Hosted Classes").child(ID); 

     query.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       //getting string values 
       Map<String, String> cl = (Map<String, String>) dataSnapshot.getValue(); 
       //getting arraylist values 
       Map<String, ArrayList<String>> days = (Map<String, ArrayList<String>>) dataSnapshot.getValue(); 
       //getting arraylist of objects(roster) 
       Map<String, Map<String, Object>> roster = (Map<String, Map<String, Object>>) dataSnapshot.getValue(); 

       //assigning that data to variables 
       String id = cl.get("classID"); 
       String className = cl.get("className"); 
       String gpsLocation = cl.get("gpdLocation"); 
       String startTime = cl.get("startTime"); 
       dList = new ArrayList<String>(days.get("days")); 
       adapter.notifyDataSetChanged(); 
       String teacherID = cl.get("teacherID"); 

       //creating ClassObj for use in student "my classes" list 
       ClassObj newClass = new ClassObj(className, id, startTime, dList, gpsLocation); 

       tvDetailName.setText("Class Name: " + newClass.getClassName()); 
       tvID.setText("Class ID: " + newClass.getClassID()); 
       tvStart.setText("Start Time(MilTime): " + newClass.getStartTime()); 


      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

    } 
} 

Das Listview (lvDayList) nicht füllen, obwohl die Textviews bevöl gut. Ich habe versucht, die Arraylist dList in einigen verschiedenen Orten zu initialisieren. Ich denke, es hat etwas damit zu tun, wie ich die dList bevölkern, aber ich bin mir nicht sicher, ob es richtig ist, wenn es falsch gemacht wird. Wenn das nicht das Problem ist, dann ziehe ich hier eine Lücke. Jede Hilfe ist willkommen

Antwort

0

Sie sollen nicht den dlist neu initialisiert, da die Listenansicht eine hält Referenz für das Dataset, das Sie beim Instanziieren des Adapters verwendet haben. Wenn Sie also adapter.notifyDataSetChanged() aufrufen, wird die vorhandene Referenz der Liste verwendet. Wenn Sie die Liste neu initialisieren, hat dies keine Auswirkungen. Sie müssen die Liste löschen und die Werte zur Liste hinzufügen und dann adapter.notifyDataSetChanged(); aufrufen. Bitte lesen Sie diese SO Link für Details: https://stackoverflow.com/a/23195575/6452886

ich Ihren Code nur für das Verständnis geändert:

public class TeacherClassDetail extends AppCompatActivity { 

    //in progress. teacher will set their question here and be able to take attendance and other teacher stuff... 
    final DatabaseReference fbRef = FirebaseDatabase.getInstance().getReference(); 
    final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    Button setQuestion; 
    Button removeClass; 
    TextView tvDetailName; 
    TextView tvID; 
    TextView tvStart; 
    ListView lvDayList; 
    ArrayList<String> dList = new ArrayList<String>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_teacher_class_detail); 

     final ArrayAdapter<String> adapter = new ArrayAdapter<String> 
       (this, android.R.layout.simple_list_item_1, dList); 

     lvDayList = (ListView) findViewById(R.id.lvDays); 
     setQuestion = (Button) findViewById(R.id.bSetQuestion); 
     removeClass = (Button) findViewById(R.id.bRemoveClass); 
     tvDetailName = (TextView) findViewById(R.id.tvCDetailName); 
     tvID = (TextView) findViewById(R.id.tvCDetailID); 
     tvStart = (TextView) findViewById(R.id.tvCDetailStart); 

    } 

    protected void onStart(){ 
     super.onStart(); 

     final ArrayAdapter<String> adapter = new ArrayAdapter<String> 
       (TeacherClassDetail.this, android.R.layout.simple_list_item_1, dList); 

     lvDayList.setAdapter(adapter); 

     final String ID = getIntent().getStringExtra("ID"); 
     Query query = fbRef.child("Users").child(user.getUid()).child("Hosted Classes").child(ID); 

     query.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       //getting string values 
       Map<String, String> cl = (Map<String, String>) dataSnapshot.getValue(); 
       //getting arraylist values 
       Map<String, ArrayList<String>> days = (Map<String, ArrayList<String>>) dataSnapshot.getValue(); 
       //getting arraylist of objects(roster) 
       Map<String, Map<String, Object>> roster = (Map<String, Map<String, Object>>) dataSnapshot.getValue(); 

       //assigning that data to variables 
       String id = cl.get("classID"); 
       String className = cl.get("className"); 
       String gpsLocation = cl.get("gpdLocation"); 
       String startTime = cl.get("startTime"); 
       dList.clear(); 
       dList.addAll(days.get("days”)); 
       adapter.notifyDataSetChanged(); 

           String teacherID = cl.get("teacherID"); 

       //creating ClassObj for use in student "my classes" list 
       ClassObj newClass = new ClassObj(className, id, startTime, dList, gpsLocation); 

       tvDetailName.setText("Class Name: " + newClass.getClassName()); 
       tvID.setText("Class ID: " + newClass.getClassID()); 
       tvStart.setText("Start Time(MilTime): " + newClass.getStartTime()); 


      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

    } 
} 
0

GELöST: hatte die Linie in onDataChange() von dList = new ArrayList<String>(days.get("days")); zu dList.addAll(days.get("days"));

0

ändern diesen Code Versuchen Sie, in onDataChange,

... 
String startTime = cl.get("startTime"); 

dList.clear(); 
dList.addAll(days.get("days")); 
adapter.notifyDataSetChanged(); 

String teacherID = cl.get("teacherID"); 
... 
+0

hah schlagen Sie es um etwa 15 Sekunden. Vielen Dank!! – ThePeskyWabbit

+0

Schön. Viel Glück :) –

0

Versuchen Sie diesen Code Sie mehrere Zeit initialisiert Adapter sind und es hat es global initialisieren.

public class TeacherClassDetail extends AppCompatActivity { 

     //in progress. teacher will set their question here and be able to take attendance and other teacher stuff... 
     final DatabaseReference fbRef = FirebaseDatabase.getInstance().getReference(); 
     final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
     Button setQuestion; 
     Button removeClass; 
     TextView tvDetailName; 
     TextView tvID; 
     TextView tvStart; 
     ListView lvDayList; 
     ArrayAdapter<String> adapter; 
     ArrayList<String> dList = new ArrayList<String>(); 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_teacher_class_detail); 
      lvDayList = (ListView) findViewById(R.id.lvDays); 
      setQuestion = (Button) findViewById(R.id.bSetQuestion); 
      removeClass = (Button) findViewById(R.id.bRemoveClass); 
      tvDetailName = (TextView) findViewById(R.id.tvCDetailName); 
      tvID = (TextView) findViewById(R.id.tvCDetailID); 
      tvStart = (TextView) findViewById(R.id.tvCDetailStart); 
      adapter = new ArrayAdapter<String> 
        (this, android.R.layout.simple_list_item_1, dList); 
      lvDayList.setAdapter(adapter); 

     } 

     protected void onStart(){ 
      super.onStart(); 



      final String ID = getIntent().getStringExtra("ID"); 
      Query query = fbRef.child("Users").child(user.getUid()).child("Hosted Classes").child(ID); 

      query.addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        //getting string values 
        Map<String, String> cl = (Map<String, String>) dataSnapshot.getValue(); 
        //getting arraylist values 
        Map<String, ArrayList<String>> days = (Map<String, ArrayList<String>>) dataSnapshot.getValue(); 
        //getting arraylist of objects(roster) 
        Map<String, Map<String, Object>> roster = (Map<String, Map<String, Object>>) dataSnapshot.getValue(); 

        //assigning that data to variables 
        String id = cl.get("classID"); 
        String className = cl.get("className"); 
        String gpsLocation = cl.get("gpdLocation"); 
        String startTime = cl.get("startTime"); 
        // dList = new ArrayList<String>(days.get("days")); 
        dList.clear();//clear your list 
        dList.add(days.get("days")); // add to the list 
        adapter.notifyDataSetChanged(); 
        String teacherID = cl.get("teacherID"); 

        //creating ClassObj for use in student "my classes" list 
        ClassObj newClass = new ClassObj(className, id, startTime, dList, gpsLocation); 

        tvDetailName.setText("Class Name: " + newClass.getClassName()); 
        tvID.setText("Class ID: " + newClass.getClassID()); 
        tvStart.setText("Start Time(MilTime): " + newClass.getStartTime()); 


       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 

     } 
    } 
+0

Wir müssen den Datensatz löschen und dann die Daten hinzufügen. Andernfalls wird die Größe des Datensatzes lang. – Madhan

+0

ya seine Best Practice Clear List Normalerweise wirkt sich dies nicht auf die Datengröße aus, da Daten, die onstart-Methode und onstart hinzufügen, nicht jedes Mal ausgeführt werden, wenn Sie die restart-Methode erneut aufrufen. –

+0

Ja, Sie haben Recht. Die Methode onStart() wird nicht oft aufgerufen. Die Methode onDataChange() wird jedoch jedes Mal aufgerufen, wenn eine Datenänderung auftritt. In dieser Zeit wird die Datenlistengröße höher, wenn Sie hinzufügen, ohne vorhandene Daten in der Liste zu löschen. – Madhan

0

Lassen Sie uns sagen Sie instanziieren und den Adapter onCreate() -Methode Einstellung und Ihre Liste in onStart Initialisierung(). Sie sollten den Adapter in onResume() wie folgt instanziieren und einstellen:

public void onResume(){ 
    super.onResume(); 
     adapter = new ArrayAdapter<String> 
       (this, android.R.layout.simple_list_item_1, dList); 
     lvDayList.setAdapter(adapter); 
}