package edu.vanderbilt.vm.guide.ui.adapter;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.location.Location;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import edu.vanderbilt.vm.guide.R;
import edu.vanderbilt.vm.guide.db.GuideDBConstants;
import edu.vanderbilt.vm.guide.util.DBUtils;
import edu.vanderbilt.vm.guide.util.Geomancer;
public class PlaceCursorAdapter extends BaseAdapter {
private final Cursor mCursor;
private final Context mContext;
private int mIdColIx;
private int mNameColIx;
private int mCatColIx;
private int mLatColIx;
private int mLngColIx;
/**
* Do not call this constructor.
*
* @throws Exception
*/
public PlaceCursorAdapter() throws Exception {
throw new Exception("Do not call this constructor");
}
public PlaceCursorAdapter(Context context, Cursor cursor) {
mContext = context;
mCursor = cursor;
mIdColIx = mCursor.getColumnIndex(GuideDBConstants.PlaceTable.ID_COL);
if (mIdColIx == -1) {
throw new SQLiteException("Cursor does not have an id column");
}
mNameColIx = mCursor.getColumnIndex(GuideDBConstants.PlaceTable.NAME_COL);
if (mNameColIx == -1) {
throw new SQLiteException("Cursor does not have a name column");
}
mCatColIx = mCursor.getColumnIndex(GuideDBConstants.PlaceTable.CATEGORY_COL);
if (mCatColIx == -1) {
throw new SQLiteException("Cursor does not have a category column");
}
mLatColIx = mCursor.getColumnIndex(GuideDBConstants.PlaceTable.LATITUDE_COL);
if (mLatColIx == -1) {
throw new SQLiteException("Cursor does not have a latitude column");
}
mLngColIx = mCursor.getColumnIndex(GuideDBConstants.PlaceTable.LONGITUDE_COL);
if (mLngColIx == -1) {
throw new SQLiteException("Cursor does not have a longitude column");
}
}
public static String[] getExpectedProjection() {
return new String[] {
GuideDBConstants.PlaceTable.ID_COL, GuideDBConstants.PlaceTable.NAME_COL,
GuideDBConstants.PlaceTable.CATEGORY_COL, GuideDBConstants.PlaceTable.LATITUDE_COL,
GuideDBConstants.PlaceTable.LONGITUDE_COL
};
}
@Override
public int getCount() {
return mCursor.getCount();
}
@Override
public Object getItem(int position) {
checkPosition(position);
mCursor.moveToPosition(position);
return DBUtils.getPlaceFromCursor(mCursor);
}
@Override
public long getItemId(int position) {
checkPosition(position);
mCursor.moveToPosition(position);
return mCursor.getInt(mIdColIx);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
checkPosition(position);
LinearLayout layout;
if (convertView == null) {
layout = (LinearLayout)LayoutInflater.from(mContext).inflate(R.layout.place_list_item,
null);
layout.setTag(layout);
} else {
layout = (LinearLayout)convertView.getTag();
}
// no header
layout.findViewById(R.id.placelist_item_header).setVisibility(View.GONE);
mCursor.moveToPosition(position);
((TextView)layout.findViewById(R.id.placelist_item_title)).setText(mCursor
.getString(mNameColIx));
// TODO replace placeholder with categorical icon
((ImageView)layout.findViewById(R.id.placelist_item_thumbnail))
.setImageResource(R.drawable.home);
Location tmp = new Location("Temp");
tmp.setLatitude(Double.parseDouble(mCursor.getString(mLatColIx)));
tmp.setLongitude(Double.parseDouble(mCursor.getString(mLngColIx)));
((TextView)layout.findViewById(R.id.placelist_item_distance)).setText(Geomancer
.getDistanceString(tmp));
return layout;
}
private void checkPosition(int position) {
if (position < 0 || position >= mCursor.getCount()) {
throw new IndexOutOfBoundsException("Position " + position
+ " is invalid for a cursor with " + getCount() + "rows.");
}
}
}