¿Cómo atravesar una estructura Firebase en Android?

Necesito atravesar el esquema de Firebase para obtener datos para cadaworkouts & mostrarlo en un RecyclerView. Ahora no puedo atravesar el esquema en Firebase usando el oyente y obtenerlo a través de la clase POJO llamadaProgram.

JSON de Firebase

{
  "subscriptions" : {
    "han@gmail,com" : {
      "-KDnhRwHjssOejrqyenP" : {
        "category" : "Strength",
        "goal" : "This workout can be done while on the phone!",
        "length" : 1,
        "title" : "Hello Workouts",
        "weeks" : {
          "week1" : [ "High Knees", "Jumping Jacks", "Wall sit", "Pushups", "Sit-ups", "Step ups", "Squats", "Tricep dips on chair", "Plank", "High Knees running in place", "Lunges", "Pushup and rotation", "Side plank (alternate per round)", "Alternating Push-Up Plank", "Chest Expander", "Diamond Push-ups", "Dive Bomber Push-ups", "Butt Kickers", "Lying Triceps Lifts", "One Arm Side Push-up", "Overhead Arm Clap", "Overhead Press", "Power Circles", "Push-up and Rotation", "T Push-ups", "Reverse Plank", "Spiderman Push-up", "T Raise", "Tricep Dips", "Wall Push-ups", "Wide Arm Push-ups", "Burpees" ]
        }
      },
      "-KDni3TN4NMyGXePyp92" : {
        "category" : "Strength",
        "goal" : "This workout can be done by a BABUJI",
        "length" : 1,
        "title" : "Indian Workouts",
        "weeks" : {
          "week1" : [ "Diamond Pushups", "Jackknives", "Plyo Lunges", "Plyo Squats", "Single leg plank (alternate per round)", "Plyo Lunges", "Pushup and rotation", "Weighted side plank (alternate per round)", "Alternating Push-Up Plank", "Chest Expander", "Diamond Push-ups", "Dive Bomber Push-ups", "One Arm Side Push-up", "Overhead Press", "Push-up and Rotation", "T Push-ups", "Spiderman Push-up", "Wide Arm Push-ups", "Burpee Pushups" ]
        }
      }
    },
    "obama@gmsil,com" : {
      "-KDnfjROKeFAL9wccsxY" : {
        "category" : "Mobility",
        "goal" : "afternoon body weight workout",
        "length" : 1,
        "title" : "Afternoon HiiT",
        "weeks" : {
          "week1" : [ "High Knees", "Squats", "Lunges", "Diamond Push-ups", "Lying Triceps Lifts" ]
        }
      },
      "-KDps90Dn6XtJc6Co00b" : {
        "category" : "Strength",
        "goal" : "goal",
        "length" : 1,
        "title" : "title",
        "weeks" : {
          "week1" : [ "Diamond Pushups", "Jackknives", "Plyo Lunges", "Plyo Squats", "Single leg plank (alternate per round)", "Plyo Lunges", "Pushup and rotation", "Weighted side plank (alternate per round)", "Alternating Push-Up Plank", "Chest Expander", "Diamond Push-ups", "Dive Bomber Push-ups", "One Arm Side Push-up", "Overhead Press", "Push-up and Rotation", "T Push-ups", "Spiderman Push-up", "Wide Arm Push-ups", "Burpee Pushups" ]
        }
      }
    }
  }
  }

CÓDIGO del oyente

    public void FB(){
ref.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot snapshot) {
                    for (DataSnapshot postSnapshot: snapshot.getChildren()) {
                        System.out.println(postSnapshot.getValue());
    //Program post = proSnapshot.getValue(Program.class);
                    }
                }
                @Override
                public void onCancelled(FirebaseError firebaseError) {
                    System.out.println("The read failed: " + firebaseError.getMessage());
                }
            });
        }

LOGCAT

03-28 08: 52: 53.966 23584-23584 / com.android.sam I / System.out: {-KDni3TN4NMyGXePyp92 = {semanas = {week1 = [Flexiones de diamante, navajas, Plyo Lunges, Plyo Squats, tabla de una sola pierna (alternativa por ronda), Plyo Lunges, Pushup y rotación, Tabla lateral ponderada (alternativa por ronda), Tabla de flexión alterna, Expansor de cofre, Flexiones de diamante, Flexiones de bomba de buceo, Flexión lateral de un brazo, Prensa de arriba, Flexiones y rotación, flexiones en T, flexiones de Spiderman, flexiones de brazo ancho, flexiones de burpee]}, título = entrenamientos indios, categoría = fuerza, longitud = 1, objetivo = este ejercicio puede ser realizado por un BABUJI }, -KDnhRwHjssOejrqyenP = {semanas = {week1 = [Rodillas altas, saltos, sentadillas en la pared, flexiones, abdominales, escalones, sentadillas, saltos de tríceps en la silla, tablones, rodillas altas en su lugar, estocadas, flexiones y rotación , Tablón lateral (alternativo por ronda), tablón de flexión alterna, expansor de pecho, flexiones de diamante, flexiones de bombardero de inmersión, golpeadores de trasero, elevadores de tríceps tendidos, flexión lateral de un brazo, aplauso de arriba, prensa de arriba, Círculos de poder, pus h-up and Rotation, T Push-ups, Reverse Plank, Spiderman Push-up, T Raise, Tricep Dips, Wall Push-ups, Wide Arm Push-ups, Burpees]}, title = Hello Workouts, categoría = Fuerza, longitud = 1, objetivo = ¡Este entrenamiento se puede hacer mientras está en el teléfono!}}

03-28 08: 52: 53.967 23584-23584 / com.android.sam I / System.out: {-KDnfjROKeFAL9wccsxY = {semanas = {week1 = [Rodillas altas, sentadillas, estocadas, flexiones de diamantes, levantamientos de tríceps mentirosos] }, título = Tarde HiiT, categoría = Movilidad, longitud = 1, objetivo = entrenamiento de peso corporal por la tarde}, -KDps90Dn6XtJc6Co00b = {semanas = {week1 = [Flexiones de diamante, Navajas, Plyo Lunges, Plyo Squats, Plancha de una sola pierna (alternativa por ronda), Plyo Lunges, Pushup y rotación, Tabla lateral ponderada (alternativa por ronda), Tabla de flexión alterna, Expansor de pecho, Flexiones de diamante, Flexiones de bombardero de inmersión, Flexión lateral de un brazo, Prensa de arriba, Push -up and Rotation, T Push-ups, Spiderman Push-up, Wide Arm Push-ups, Burpee Pushups]}, título = título, categoría = Fuerza, longitud = 1, gol = gol}}

Program.java

public class Program {
    private String title;

    private String goal;

    private String category;

    private int length;

    HashMap<String, ArrayList<String>> weeks;

    /**
     * Required public constructor
     */
    public Program() {
    }

    public Program(String title, String goal,  String category, int length, HashMap<String, ArrayList<String>> weeks) {
        this.title = title;
        this.goal = goal;
        this.category = category;
        this.length = length;
        this.weeks = weeks;
    }

    public String getTitle() {
        return title;
    }

    public String getGoal() {
        return goal;
    }

    public String getCategory() {
        return category;
    }
    public int getLength() {
        return length;
    }
    public HashMap<String, ArrayList<String>> getweeks() {
        return weeks;
    }    
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta