package org.taptwo.android.widget.viewflow.example; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import org.taptwo.android.widget.TitleProvider; import org.taptwo.android.widget.viewflow.example.R; import android.content.Context; import android.os.AsyncTask; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ProgressBar; import android.widget.TextView; public class AsyncAdapter extends BaseAdapter implements TitleProvider { private LayoutInflater mInflater; private static final DateFormat dfTitle = new SimpleDateFormat("E, dd MMM"); private static final int daysDepth = 10; private static final int daysSize = daysDepth * 2 + 1; private static Date[] dates = new Date[ daysSize ]; private static String[] content = new String[ daysSize ]; private class ViewHolder { ProgressBar mProgressBar; View mContent; TextView mDate; } public AsyncAdapter(Context context) { mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); prepareDates(); } @Override public String getItem(int position) { return content[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { return drawView(position, convertView); } private View drawView(int position, View view) { ViewHolder holder = null; if(view == null) { view = mInflater.inflate(R.layout.day_view, null); holder = new ViewHolder(); holder.mProgressBar = (ProgressBar) view.findViewById(R.id.progress); holder.mDate = (TextView) view.findViewById(R.id.date); holder.mContent = (View) view.findViewById(R.id.content); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } final String o = getItem(position); if (o != null) { holder.mProgressBar.setVisibility(View.GONE); holder.mDate.setText(o); holder.mContent.setVisibility(View.VISIBLE); } else { new LoadContentTask().execute(position, view); holder.mContent.setVisibility(View.GONE); holder.mProgressBar.setVisibility(View.VISIBLE); } return view; } @Override public String getTitle(int position) { return dfTitle.format( dates[position] ); } @Override public int getCount() { return dates.length; } public int getTodayId() { return daysDepth; } public Date getTodayDate() { return dates[daysDepth]; } /** * Prepare dates for navigation, to past and to future */ private void prepareDates() { Date today = new Date(); Calendar calPast = Calendar.getInstance(); Calendar calFuture = Calendar.getInstance(); calPast.setTime(today); calFuture.setTime(today); dates[ daysDepth ] = calPast.getTime(); for (int i = 1; i <= daysDepth; i++) { calPast.add( Calendar.DATE, -1 ); dates[ daysDepth - i ] = calPast.getTime(); calFuture.add( Calendar.DATE, 1 ); dates[ daysDepth + i ] = calFuture.getTime(); } } private class LoadContentTask extends AsyncTask<Object, Object, Object> { private Integer position; private View view; @Override protected Object doInBackground(Object... arg) { position = (Integer) arg[0]; view = (View) arg[1]; // long-term task is here try { Thread.sleep(3000); // do nothing for 3000 miliseconds (3 second) } catch (InterruptedException e) { e.printStackTrace(); } return getTitle(position); } protected void onPostExecute(Object result) { // process result content[position] = (String) result; drawView(position, view); view.postInvalidate(); } } }