package siso.weekv;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import retrofit.Callback;
import retrofit.RestAdapter;
import retrofit.RetrofitError;
import retrofit.client.Response;
import siso.weekv.apiclient.Event;
import siso.weekv.apiclient.MyJsonService;
import siso.wvlib.WeekViewEvent;
/**
* An example of how events can be fetched from network and be displayed on the week view.
* Created by Raquib-ul-Alam Kanak on 1/3/2014.
* Website: http://alamkanak.github.io
*/
public classAsynchronousActivityextendsBaseActivityimplementsCallback<List<Event>> {private List<WeekViewEvent> events = new ArrayList<WeekViewEvent>();
boolean calledNetwork = false;
@Override
public List<? extends WeekViewEvent> onMonthChange(int newYear, int newMonth) {
// Download events from network if it hasn't been done already. To understand how events are// downloaded using retrofit, visit http://square.github.io/retrofitif (!calledNetwork) {
RestAdapter retrofit = new RestAdapter.Builder()
.setEndpoint("https://api.myjson.com/bins")
.build();
MyJsonService service = retrofit.create(MyJsonService.class);
service.listEvents(this);
calledNetwork = true;
}
// Return only the events that matches newYear and newMonth.
List<WeekViewEvent> matchedEvents = new ArrayList<WeekViewEvent>();
for (WeekViewEvent event : events) {
if (eventMatches(event, newYear, newMonth)) {
matchedEvents.add(event);
}
}
return matchedEvents;
}
/**
* Checks if an event falls into a specific year and month.
* @param event The event to check for.
* @param year The year.
* @param month The month.
* @return True if the event matches the year and month.
*/private boolean eventMatches(WeekViewEvent event, int year, int month) {
return (event.getStartTime().get(Calendar.YEAR) == year && event.getStartTime().get(Calendar.MONTH) == month - 1) || (event.getEndTime().get(Calendar.YEAR) == year && event.getEndTime().get(Calendar.MONTH) == month - 1);
}
@Override
public void success(List<Event> events, Response response) {
this.events.clear();
for (Event event : events) {
this.events.add(event.toWeekViewEvent());
}
getWeekView().notifyDatasetChanged();
}
@Override
public void failure(RetrofitError error) {
error.printStackTrace();
Toast.makeText(this, R.string.async_error, Toast.LENGTH_SHORT).show();
}
}
BaseActivity.java
package siso.weekv;
import android.graphics.RectF;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
import siso.wvlib.DateTimeInterpreter;
import siso.wvlib.MonthLoader;
import siso.wvlib.WeekView;
import siso.wvlib.WeekViewEvent;
publicabstractclassBaseActivityextendsAppCompatActivityimplementsWeekView.EventClickListener, MonthLoader.MonthChangeListener, WeekView.EventLongPressListener, WeekView.EmptyViewLongPressListener {privatestaticfinalint TYPE_DAY_VIEW = 1;
privatestaticfinalint TYPE_THREE_DAY_VIEW = 2;
privatestaticfinalint TYPE_WEEK_VIEW = 3;
privateint mWeekViewType = TYPE_THREE_DAY_VIEW;
private WeekView mWeekView;
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base);
// Get a reference for the week view in the layout.
mWeekView = (WeekView) findViewById(R.id.weekView);
// Show a toast message about the touched event.
mWeekView.setOnEventClickListener(this);
mWeekView.setMonthChangeListener(this);
// Set long press listener for events.
mWeekView.setEventLongPressListener(this);
mWeekView.setEmptyViewLongPressListener(this);
setupDateTimeInterpreter(false);
}
@OverridepublicbooleanonCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
returntrue;
}
@OverridepublicbooleanonOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
setupDateTimeInterpreter(id == R.id.action_week_view);
switch (id){
case R.id.action_today:
mWeekView.goToToday();
returntrue;
case R.id.action_day_view:
if (mWeekViewType != TYPE_DAY_VIEW) {
item.setChecked(!item.isChecked());
mWeekViewType = TYPE_DAY_VIEW;
mWeekView.setNumberOfVisibleDays(1);
// Lets change some dimensions to best fit the view.
mWeekView.setColumnGap((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics()));
mWeekView.setTextSize((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 12, getResources().getDisplayMetrics()));
mWeekView.setEventTextSize((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 12, getResources().getDisplayMetrics()));
}
returntrue;
case R.id.action_three_day_view:
if (mWeekViewType != TYPE_THREE_DAY_VIEW) {
item.setChecked(!item.isChecked());
mWeekViewType = TYPE_THREE_DAY_VIEW;
mWeekView.setNumberOfVisibleDays(3);
// Lets change some dimensions to best fit the view.
mWeekView.setColumnGap((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics()));
mWeekView.setTextSize((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 12, getResources().getDisplayMetrics()));
mWeekView.setEventTextSize((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 12, getResources().getDisplayMetrics()));
}
returntrue;
case R.id.action_week_view:
if (mWeekViewType != TYPE_WEEK_VIEW) {
item.setChecked(!item.isChecked());
mWeekViewType = TYPE_WEEK_VIEW;
mWeekView.setNumberOfVisibleDays(7);
mWeekView.setColumnGap((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, getResources().getDisplayMetrics()));
mWeekView.setTextSize((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 10, getResources().getDisplayMetrics()));
mWeekView.setEventTextSize((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 10, getResources().getDisplayMetrics()));
}
returntrue;
}
returnsuper.onOptionsItemSelected(item);
}
privatevoidsetupDateTimeInterpreter(finalboolean shortDate) {
mWeekView.setDateTimeInterpreter(new DateTimeInterpreter() {
@Overridepublic String interpretDate(Calendar date) {
SimpleDateFormat weekdayNameFormat = new SimpleDateFormat("EEE", Locale.getDefault());
String weekday = weekdayNameFormat.format(date.getTime());
SimpleDateFormat format = new SimpleDateFormat(" M/d", Locale.getDefault());
if (shortDate)
weekday = String.valueOf(weekday.charAt(0));
return weekday.toUpperCase() + format.format(date.getTime());
}
@Overridepublic String interpretTime(int hour) {
return hour > 11 ? (hour - 12) + " PM" : (hour == 0 ? "12 AM" : hour + " AM");
}
});
}
protected String getEventTitle(Calendar time) {
return String.format("事件 %02d:%02d %s/%d", time.get(Calendar.HOUR_OF_DAY), time.get(Calendar.MINUTE), time.get(Calendar.MONTH)+1, time.get(Calendar.DAY_OF_MONTH));
}
@OverridepublicvoidonEventClick(WeekViewEvent event, RectF eventRect) {
Toast.makeText(this, "点击 " + event.getName(), Toast.LENGTH_SHORT).show();
}
@OverridepublicvoidonEventLongPress(WeekViewEvent event, RectF eventRect) {
Toast.makeText(this, "长按事件: " + event.getName(), Toast.LENGTH_SHORT).show();
}
@OverridepublicvoidonEmptyViewLongPress(Calendar time) {
Toast.makeText(this, "空视图长按: " + getEventTitle(time), Toast.LENGTH_SHORT).show();
}
public WeekView getWeekView() {
return mWeekView;
}
}