Search code examples
javaandroidarraysinterface

ArrayList of listeners not respondind to a call


(Can't Delete this question... don't mind wrong question)

I have a public static ArrayList of listeners and in each activity i'm adding a new listener to the list and when i'm iterating to call to each listener in the list no one of the activity gets the remove call, can sombody tell me what am i doing wrong?

(sorry for the poor english...)

Listener MealsListListener.class

public interface MealsListListener {
    void onMealAdded(Meal meal, int babyID);
    void onMealRemoved(Meal meal);
    void onMealChanged(Meal meal);
}

ArrayList MealListListeners.class

public class MealListListeners {

    ArrayList<MealsListListener> mealsListListeners = new ArrayList<>();

    public MealListListeners() {
    }

    public void addMealsListListener(MealsListListener mealsListListener) {
        this.mealsListListeners.add(mealsListListener);
    }

    public void onMealAdded(Meal meal, int babyID) {
        for (MealsListListener mealsListListener : mealsListListeners) {
            mealsListListener.onMealAdded(meal, babyID);
        }
    }

    public void onMealRemoved(Meal meal){
        for (MealsListListener mealsListListener : mealsListListeners) {
            mealsListListener.onMealChanged(meal);
        }
    }

    public void onMealChanged(Meal meal) {
        for (MealsListListener mealsListListener : mealsListListeners) {
            mealsListListener.onMealRemoved(meal);
        }
    }

}

Activity MainActivity.class

public class MainActivity extends AppCompatActivity {

    public static MealListListeners mealListListeners = new MealListListeners();

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

        mealListListeners.addMealsListListener(new MealsListListener() {
            @Override
            public void onMealAdded(Meal meal, int babyID) {

                Toast.makeText(getApplicationContext(), "onMealAdded", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onMealRemoved(Meal meal) {
                
                Toast.makeText(getApplicationContext(), "onMealRemoved", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onMealChanged(Meal meal) {

                Toast.makeText(getApplicationContext(), "onMealChanged", Toast.LENGTH_SHORT).show();
            }
        });

    }

}

a call from dialog in DialogMeal.class

public class DialogMeal extends BottomSheetDialog {

    public DialogMeal(@NonNull Context context, Meal meal) {
        super(context);

        addNewMeal(meal);
        saveMealChanges(meal);
        removeMealAction(meal);
    }

    public void addNewMeal(Meal meal) {

        MainActivity.mealListListeners.onMealAdded(meal, 0);
    }

    private void saveMealChanges(Meal meal) {

        MainActivity.mealListListeners.onMealChanged(meal);
    }

    private void removeMealAction(Meal meal) {

        MainActivity.mealListListeners.onMealRemoved(meal);
    }

 }

Solution

  • When handling the event you call the wrong methods on the listender

    public void onMealAdded(Meal meal, int babyID) {
        for (MealsListListener mealsListListener : mealsListListeners) {
            mealsListListener.onMealAdded(meal, babyID); // correct
        }
    }
    
    public void onMealRemoved(Meal meal){
        for (MealsListListener mealsListListener : mealsListListeners) {
            mealsListListener.onMealChanged(meal); // should be onMealRemoved
        }
    }
    
    public void onMealChanged(Meal meal) {
        for (MealsListListener mealsListListener : mealsListListeners) {
            mealsListListener.onMealRemoved(meal); // should be onMealChanged
        }
    }