2017-01-16 1 views
1

Я создаю приложение для Android и сталкиваюсь с проблемой с DatePicker. Моя реализация (так, как я ее хочу) выглядит следующим образом: A GridView (с изображениями) и по выбранному элементу начинают новое намерение. На конкретный элемент, я хочу, во-первых, запустить DatePicker и по выбору DatePicker, начать новое намерение. Проблема в том, что или DatePicker запустит позже, что предполагается, или он не начнется вообще. Если кто-нибудь может помочь, я буду благодарен (о коде или если он сможет предоставить мне еще одно правильное решение для реализации).Android: Datepicker внутри GridView

Так что у меня этот код в onCreate():

gridview.setAdapter(myAdapter); 
     calendarDate = Calendar.getInstance(); 
     caseCalendar = Calendar.getInstance(); 
     gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
       if(position == 7){ 
        onCustomDatePicker(); 
        if(caseCalendar.get(Calendar.DAY_OF_YEAR) < calendarDate.get(Calendar.DAY_OF_YEAR)){ 
         Toast.makeText(getBaseContext(), "Πρέπει να επιλέξεις μεταγενέστερη ημερομηνία", Toast.LENGTH_SHORT).show(); 
         onCustomDatePicker(); 
        } 
       } 
       else{ 
        caseCalendar = calendarDate; 
       } 
       Intent intent = new Intent(getBaseContext(), Customize.class); 
       ViewHolder holder = (ViewHolder) v.getTag(); 
       DateWithImage temp = (DateWithImage) holder.image.getTag(); 
       intent.putExtra("image",temp.getImageID()); 
       intent.putExtra("option",position); 
       intent.putExtra("info",temp.getInfo()); 
       intent.putExtra("calendar", calendarDate); 
       intent.putExtra("caseCalendar", caseCalendar); 
       startActivity(intent); 
       Toast.makeText(getBaseContext(), "" + position, Toast.LENGTH_SHORT).show(); 
      } 
     }); 

и этот код для DatePicker:

private void onCustomDatePicker(){ 
    new DatePickerDialog(this, d, caseCalendar.get(Calendar.YEAR),caseCalendar.get(Calendar.MONTH),caseCalendar.get(Calendar.DAY_OF_MONTH)).show(); 
} 

DatePickerDialog.OnDateSetListener d = new DatePickerDialog.OnDateSetListener() { 
    @Override 
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
     caseCalendar.set(Calendar.YEAR, year); 
     caseCalendar.set(Calendar.MONTH, monthOfYear); 
     caseCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 
    } 
}; 

Я пытаюсь установить новую дату в caseCalendar и сравнить его с calendarDate (который содержит текущую дату).

ответ

0

Вы звоните startActivity(intent); каждый раз, когда вы собираетесь нажать на изображение. Для конкретных элементов, которые нужно написать так:

if(position == 7){ 
        onCustomDatePicker(); 
        if(caseCalendar.get(Calendar.DAY_OF_YEAR) < calendarDate.get(Calendar.DAY_OF_YEAR)){ 
         Toast.makeText(getBaseContext(), "Πρέπει να επιλέξεις μεταγενέστερη ημερομηνία", Toast.LENGTH_SHORT).show(); 
         onCustomDatePicker(); 
        } 
       } 
       else{ 
        caseCalendar = calendarDate; 
Intent intent = new Intent(getBaseContext(), Customize.class); 
       ViewHolder holder = (ViewHolder) v.getTag(); 
       DateWithImage temp = (DateWithImage) holder.image.getTag(); 
       intent.putExtra("image",temp.getImageID()); 
       intent.putExtra("option",position); 
       intent.putExtra("info",temp.getInfo()); 
       intent.putExtra("calendar", calendarDate); 
       intent.putExtra("caseCalendar", caseCalendar); 
       startActivity(intent); 
       Toast.makeText(getBaseContext(), "" + position,  Toast.LENGTH_SHORT).show(); 
       } 

Сначала вам нужно вызвать только Datepicker диалог, а затем на дату набора вы можете начать новую деятельность. Прямо сейчас вы начинаете работу только при щелчке по изображению.

+0

Спасибо за ваш ответ, но он не работает, хотя ваша реализация дала мне несколько полезных советов. К сожалению, или я застрял с дампикером, или новое намерение появится, прежде чем я смогу выбрать. –

0

OK, Так что я, наконец, нашел решение, только в случае, если кто-то сталкивается с этой проблемой (в Datepicker, реализованный внутри gridview.SetOnClickListener) -

Чтобы быть honnest, хотя он работает, я был бы признателен, если кто-то мог бы сказать мне, если это хорошая практика программирования ....:

Я использовал два Календари (один для текущего дня и один для выбранного - по-видимому, если я инициализирую caseCalendar с getInstance(), это получает такое же значение с помощью calendarDate ?????):

calendarDate = Calendar.getInstance(); 
     caseCalendar = new GregorianCalendar(calendarDate.get(Calendar.YEAR), calendarDate.get(Calendar.MONTH) ,calendarDate.get(Calendar.DAY_OF_MONTH)-1); 

внутри OnCreate():

gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
       final ViewHolder holder = (ViewHolder) v.getTag(); 
       final int mposition = position; 
       if(mposition == 7){//in my case the desired position to trigger the dayPicker 
        if(caseCalendar.compareTo(calendarDate)< 0){ 
         Toast.makeText(getBaseContext(), "", Toast.LENGTH_LONG).show(); 
         onCustomDatePicker(holder,mposition); 
        } 
       } 
       else{ 
        caseCalendar = calendarDate; 
        startNewActivity(holder,mposition); 
       } 
      } 
     }); 

На одном конкретном варианте, я хочу, чтобы получить Datepicker перед новым видом деятельности, но и на другие варианты, я хочу, чтобы начать новую деятельность немедленно. Поэтому я использовал эти два метода:

private void onCustomDatePicker(final ViewHolder holder, final int mposition){ 
     new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { 
      @Override 
      public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
       caseCalendar.set(Calendar.YEAR, year); 
       caseCalendar.set(Calendar.MONTH, monthOfYear); 
       caseCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 
       startNewActivity(holder, mposition); 
      } 
     }, caseCalendar.get(Calendar.YEAR),caseCalendar.get(Calendar.MONTH),caseCalendar.get(Calendar.DAY_OF_MONTH)).show(); 
    } 

    private void startNewActivity(final ViewHolder holder, final int mposition){ 
     Intent intent = new Intent(getBaseContext(), Customize.class); 
     DateWithImage temp = (DateWithImage) holder.image.getTag(); 
     intent.putExtra("image",temp.getImageID()); 
     intent.putExtra("option",mposition); 
     intent.putExtra("info",temp.getInfo()); 
     intent.putExtra("calendar", calendarDate); 
     intent.putExtra("caseCalendar", caseCalendar); 
     startActivity(intent); 
     Toast.makeText(getBaseContext(), "" + mposition, Toast.LENGTH_SHORT).show(); 
    }