Problem with 4x4 Keypad

i have a problem with my 4x4 keypad.example is when i pressed 1 and then pressed 2 the update on LCD not changed.but when i pressed again 2 the lcd will update.it takes 2 press to update the lcd display.

#include <Wire.h>
#include <LiquidCrystal.h>
#include <Keypad.h>

const byte rows = 4; 
const byte cols = 4; 

char keys[rows][cols] = { 
	{'1','2','3','A'},
	{'4','5','6','B'},	
	{'7','8','9','C'},
	{'*','0','#','D'}
};

byte rowPins[rows] = {0,1,2,3}; 
byte colPins[cols] = {4,5,6,7}; 
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);
LiquidCrystal lcd(8,9,10,11,12,13);
char key;
void setup()
{
	lcd.begin(20,4);
	lcd.setCursor(3,0);
	lcd.print("Enter liquor ");
        lcd.setCursor(3,1);
        lcd.print("choice :");
        lcd.setCursor(0,3);
        lcd.print("[*]ACCEPT");
        lcd.setCursor(11,3);
        lcd.print("[#]CANCEL");
}
void loop()
{
  key = keypad.getKey();
  if (key)
  {
    switch(key)
    {
      case '1':
        lcd.setCursor(0,2);
        lcd.print("                    ");     // clear text @ 3rd row in lcd
        lcd.setCursor(12,1);
        lcd.print(key);
        lcd.setCursor(5,2);
        lcd.print("Liquor Mix 1");
        break;
      case '2':
        lcd.setCursor(0,2);
        lcd.print("                    ");     // clear text @ 3rd row in lcd
        lcd.setCursor(12,1);
        lcd.print(key);
        lcd.setCursor(5,2);
        lcd.print("Liquor Mix 2");
        break;
    
}
        choice();
}
}
void choice()
{
    key = keypad.waitForKey();
    if (key)
    {
      switch(key)
      {
        case '*':
          lcd.clear();
          lcd.print("Mixing");
          break;
        case '#':
          lcd.setCursor(12,1);
          lcd.print(" ");
          lcd.setCursor(0,2);
          lcd.print("                    "); // clear text @ 3rd row in lcd
          break;
        }
}
}

That's because after you receive '1' or '2' you call 'choice()'. That waits for you to press another key and acts only on '' or '#'. If you press '2' while waiting for '' or '#' it will be ignored. You should detect '*' or '#' in your main switch rather than waiting for a separate input after each digit.

which part of the code will be changed?

The part where you call choice() after you receive and process a single keypad entry. Get rid of the choice() function and move the two case statements into your existing switch statement.