2017-08-28 6 views
1

J'ai Matériel Voir le calendrier Vous aimez cetteComment définir la couleur Date sélectionnée des matières Calendrier Voir

private RecyclerView recycler_month_event_lists; 
private FirebaseRecyclerAdapter adapter; 

et moi avons assigné comme ça

recycler_month_event_lists = (RecyclerView) view.findViewById(R.id.event_recycler_view); 
calendar_view = (MaterialCalendarView) view.findViewById(R.id.calendar_view); 

et je viens d'énumérer mes événements respectifs mois par FirebaseRecyclerAdapater comme celui-ci

recycler_month_event_lists.setLayoutManager(new LinearLayoutManager(getActivity())); 
    adapter = new FirebaseRecyclerAdapter<Event, EventViewHolder>(Event.class, R.layout.row_event_list, 
      EventViewHolder.class, mRef.child("events").child("1").child(month)) { 

     @Override 
     protected void populateViewHolder(EventViewHolder viewHolder, Event model, int position) { 
      List<CalendarDay> list = new ArrayList<CalendarDay>(); 
      ArrayList<Integer> day = model.getDate(); 
      ArrayList<Date> markedDates = new ArrayList<>(); 
      Calendar calendar = Calendar.getInstance(); 

      //generating ArrayList<Date> 
      for (int i = 0; i < day.size(); ++i) { 
       Calendar cal = Calendar.getInstance(); 
       Integer year = cal.get(Calendar.YEAR); 
       cal.set(Calendar.YEAR, year); 
       cal.set(Calendar.DAY_OF_MONTH, day.get(i)); 
       cal.set(Calendar.MONTH, Integer.valueOf(month)); 
       Date newdate = cal.getTime(); 
       markedDates.add(newdate); 
      } 
      //adding those generated ArrayList<Dates> in List<CalendarDays> 
      for (Date date : markedDates) { 
       // might be a more elegant way to do this part, but this is very explicit 
       int year = date.getYear(); 
       int month = date.getMonth() -1; // months are 0-based in Calendar 
       int newday = date.getDay(); 

       calendar.set(year, month, newday); 
       CalendarDay calendarDay = CalendarDay.from(calendar); 
       list.add(calendarDay); 
      } 

      //adding list of CalendarDays 
      calendarDays = list; 

      //code to decorate selected dates 
      calendar_view.addDecorators(new EventDecorator(Color.parseColor("#00ff00"), calendarDays)); 



      if (!day.isEmpty()) { 

       for(int i = 0; i < day.size();i++){ 
        int z = i+1; 
        if(i == 0){ 
         from = "From"+ " " +day.get(i); 
        } 

        if(z == day.size()){ 
         to = "to"+ " " +day.get(i); 
        } 
       } 


      } 

      viewHolder.ev_title.setText(model.getTitle()); 
      viewHolder.ev_description.setText(model.getDescription()); 
      viewHolder.ev_date.setText(from + " " + to); 
      Glide.with(getActivity()).load(model.getIcon()).into(viewHolder.ev_image); 


     } 
    }; 
    recycler_month_event_lists.setAdapter(adapter); 

} 

ici ArrayList jour = model.getDate(); renvoie le jour qui doit être coloré. le journal du jour est comme ce

D/arra: [1, 2, 3] 

Je suivais une des réponses de la pile, mais je peux obtenir mes dates de couleur je ne sais pas ce qui ne va pas avec mon code. je

calendar_view.addDecorators(new EventDecorator(Color.parseColor("#00ff00"), calendarDays)); 

pour décorer jours sélectionnés Mon EventDecorator est comme ça

public class EventDecorator implements DayViewDecorator { 

private final int color; 
private final HashSet<CalendarDay> dates; 

public EventDecorator(int color, Collection<CalendarDay> dates) { 
    this.color = color; 
    this.dates = new HashSet<>(dates); 
} 

@Override 
public boolean shouldDecorate(CalendarDay day) { 
    return dates.contains(day); 
} 

@Override 
public void decorate(DayViewFacade view) { 
    view.addSpan(new DotSpan(5, color)); 
} 
} 

Et mes CalendarDays est comme ça

private Collection<CalendarDay> calendarDays = new Collection<CalendarDay>() { 
    @Override 
    public boolean add(CalendarDay object) { 
     return false; 
    } 

    @Override 
    public boolean addAll(Collection<? extends CalendarDay> collection) { 
     return false; 
    } 

    @Override 
    public void clear() { 

    } 

    @Override 
    public boolean contains(Object object) { 
     return false; 
    } 

    @Override 
    public boolean containsAll(Collection<?> collection) { 
     return false; 
    } 

    @Override 
    public boolean isEmpty() { 
     return false; 
    } 

    @NonNull 
    @Override 
    public Iterator<CalendarDay> iterator() { 
     return null; 
    } 

    @Override 
    public boolean remove(Object object) { 
     return false; 
    } 

    @Override 
    public boolean removeAll(Collection<?> collection) { 
     return false; 
    } 

    @Override 
    public boolean retainAll(Collection<?> collection) { 
     return false; 
    } 

    @Override 
    public int size() { 
     return 0; 
    } 

    @NonNull 
    @Override 
    public Object[] toArray() { 
     return new Object[0]; 
    } 

    @NonNull 
    @Override 
    public <T> T[] toArray(T[] array) { 
     return null; 
    } 
}; 

toute aide serait appréciée. Merci d'avance.

Répondre

1

J'ai regardé votre code et je suis assez confiant que le problème réside dans la méthode decorate à l'intérieur du EventDecorator.

view.addSpan(new DotSpan(5, color)); 

ne fonctionne pas sur les dates des matériaux (ou du moins il ne change pas la couleur la façon dont vous le souhaitez).

Vous pouvez utiliser

view.addSpan(new ForegroundColorSpan(color)); 

ou

view.addSpan(new BackgroundColorSpan(color)); 

à la place.

S'il vous plaît assurez-vous que public void decorate(DayViewFacade view) est appelé pour les dates correctes. Si vous pouvez vous assurer que le réglage de la gamme de couleurs devrait fonctionner. Espérons que cela aide :)

+0

Je suis confus dans le dernier paragraphe. Vous voulez dire que les CalendarDays passés dans EventDecorator devraient avoir des dates correctes avec le mois et l'année respectifs –

+0

mon frère a résolu mon problème. le code ci-dessus fonctionne aussi mais pas comme je le voulais. le problème était que la méthode getYear() ne se retirait pas correctement l'année. Merci mec –