TrackListAdapter2.java :  » Map » swp-dv-ws2010-osm-2 » de » fuberlin » osm2 » gui » view » adapter » Android Open Source

Android Open Source » Map » swp dv ws2010 osm 2 
swp dv ws2010 osm 2 » de » fuberlin » osm2 » gui » view » adapter » TrackListAdapter2.java
package de.fuberlin.osm2.gui.view.adapter;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import de.fuberlin.osm2.R;
import de.fuberlin.osm2.data.DataBaseConnector;
import de.fuberlin.osm2.data.dao.TrackRecord;
import de.fuberlin.osm2.gui.activity.TrackActivity;
import de.fuberlin.osm2.gui.view.adapter.TrackListAdapter2.TrackListItem;
import de.fuberlin.osm2.log.Constants;

/**
 * The TrackListAdapter obtains a list of all tracks from the database and
 * provides the list for the list view in the StartActivity.
 * 
 * @author johannes & micha
 * 
 */
public class TrackListAdapter2 extends ArrayAdapter<TrackListItem> {

  private static final int TRACK_LIST_LAYOUT = R.layout.track_list_row;
  private static final int TRACK_LIST_HEADER_LAYOUT = R.layout.track_list_header;
  private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat(
      "dd.MM.yy HH:mm:ss");
  private final String datePrefix;
  private DataBaseConnector dbConnector;
  private LayoutInflater mInflater;
  private static int nrCounter;
  private TrackActivity trackActivity;

  /**
   * Constructor.
   * 
   * @param context of the caller
   */
  public TrackListAdapter2(TrackActivity context) {
    super(context, TRACK_LIST_LAYOUT);
    Log.d(Constants.TAG, "TrackListAdapter init");

    trackActivity = context;
    dbConnector = trackActivity.getDataBase();
    // Cache the LayoutInflate, dbConnector and datePrefix to avoid asking
    // for a new one each time.
    mInflater = LayoutInflater.from(context);
    datePrefix = context.getString(R.string.track_list__track_date_added);
    nrCounter = 1;
    addTracks();
  }

  private void addTracks() {

    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date());

    long now = cal.getTimeInMillis();

    // roll to start of today
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);

    long startToday = cal.getTimeInMillis();

    // roll to yesterday
    cal.add(Calendar.DAY_OF_YEAR, -1);
    long startYesterday = cal.getTimeInMillis();

    // roll two weeks into past
    cal.add(Calendar.WEEK_OF_YEAR, -2);
    long startTwoWeeksAgo = cal.getTimeInMillis();

    // adds today's tracks
    addTracksWithHeader(startToday, now - 1, R.string.track_list__today);
    // adds yesterday's tracks
    addTracksWithHeader(startYesterday, startToday - 1, R.string.track_list__yesterday);
    // adds tracks of the last two weeks
    addTracksWithHeader(startTwoWeeksAgo, startYesterday - 1,
        R.string.track_list__last_two_weeks);
    // adds all tracks which are older than two weeks
    addTracksWithHeader(0, startTwoWeeksAgo - 1, R.string.track_list__long_time_ago);

  }

  private void addTracksWithHeader(long dateFrom, long dateTo, int stringRes) {
    // DataBaseConnector dbConnector = trackActivity.getDataBase();
    Collection<TrackRecord> trackCollection = dbConnector.getAllTracksInTimeWindow(
        dateFrom, dateTo);
    if (trackCollection.size() > 0) {
      Log.d(Constants.TAG, "Collectionsize: " + trackCollection.size());
      // add header to the array, the title of the header is in a dummy
      // TrackRecorcd object
      add(new TrackListItem(new TrackRecord(0L, trackActivity.getString(stringRes), 0L),
          -1, true));
      for (TrackRecord trR : trackCollection) {
        add(new TrackListItem(trR, nrCounter++, false));
      }
    }
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolderTrack holderTrack;
    ViewHolderHeader holderHeader;
    TrackListItem trackListItem;
    View convView = convertView;
    trackListItem = this.getItem(position);

    if (trackListItem.isHeader) {
      // if conView is null or of the wrong type we have to inflate a new
      // view
      if (convView == null || convView.getTag() instanceof ViewHolderTrack) {
        convView = mInflater.inflate(TRACK_LIST_HEADER_LAYOUT, null);
        holderHeader = new ViewHolderHeader();
        holderHeader.headerName = (TextView) convView.findViewById(R.id.label);
        convView.setTag(holderHeader);
      } else {
        holderHeader = (ViewHolderHeader) convView.getTag();
      }

      holderHeader.headerName.setText(trackListItem.trackRecord.trackName);
      return convView;
    }

    if (convView == null || convView.getTag() instanceof ViewHolderHeader) {
      convView = mInflater.inflate(TRACK_LIST_LAYOUT, null);
      holderTrack = new ViewHolderTrack();
      holderTrack.trackName = (TextView) convView.findViewById(R.id.label);
      holderTrack.trackAddedTime = (TextView) convView.findViewById(R.id.sublabel);
      convView.setTag(holderTrack);
    } else {
      holderTrack = (ViewHolderTrack) convView.getTag();
    }

    holderTrack.trackName.setText(trackListItem.nr + ") "
        + trackListItem.trackRecord.trackName);
    holderTrack.trackAddedTime.setText(String.format(datePrefix,
        SIMPLE_DATE_FORMAT.format(new Long(trackListItem.trackRecord.dateTrackAdded))));
    holderTrack.trackId = trackListItem.trackRecord.trackId;

    return convView;

  }

  /**
   * A ViewHolderClass which contains all Views of a list item to avoid
   * findViewById() calls.
   * 
   */
  public static class ViewHolderTrack {
    /**
     * id of the current track.
     */
    public long trackId;
    /**
     * View which shows the name of the current track.
     */
    public TextView trackName;
    /**
     * View which shows the time when the track was created.
     */
    public TextView trackAddedTime;
  }

  /**
   * A ViewHolderClass which contains all Views of a list header to avoid
   * findViewById() calls.
   * 
   */
  public static class ViewHolderHeader {
    /**
     * View which shows the name of the current header.
     */
    TextView headerName;
  }

  /**
   * contains basic information about a Track.
   * 
   */
  static class TrackListItem {
    /**
     * the number of the item in the list.
     */
    int nr;
    /**
     * shows whether the item is a header.
     */
    boolean isHeader;
    /**
     * contains id, name and date of a track.
     */
    TrackRecord trackRecord;

    /**
     * Constructor.
     * 
     * @param trackRecord which belongs to the item
     * @param nr of the item in the list
     * @param isHeader true if the item is a header
     */
    TrackListItem(TrackRecord trackRecord, int nr, boolean isHeader) {
      this.trackRecord = trackRecord;
      this.nr = nr;
      this.isHeader = isHeader;
    }

    @Override
    public String toString() {
      if (!isHeader)
        return trackRecord.trackName;
      return "";
    }
  }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.