package edu.vanderbilt.vm.guide.ui.adapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import edu.vanderbilt.vm.guide.R;
import edu.vanderbilt.vm.guide.db.GuideDBConstants;
import edu.vanderbilt.vm.guide.db.GuideDBOpenHelper;
import edu.vanderbilt.vm.guide.util.DBUtils;
public class TourAdapter extends BaseAdapter {
public static final int NO_ID = -1;
private static final Logger logger = LoggerFactory.getLogger("ui.adapter.TourAdapter");
private Cursor mCursor;
private GuideDBOpenHelper mHelper;
private Context mContext;
public TourAdapter(Context context, Cursor tourCursor, GuideDBOpenHelper helper) {
mCursor = tourCursor;
mHelper = helper;
mContext = context;
}
@Override
public int getCount() {
return mCursor.getCount();
}
@Override
public Object getItem(int position) {
if (mCursor.moveToPosition(position)) {
SQLiteDatabase db = mHelper.getReadableDatabase();
return DBUtils.getTourFromCursor(mCursor, db);
} else {
return null;
}
}
@Override
public long getItemId(int position) {
int index = mCursor.getColumnIndex(GuideDBConstants.TourTable.ID_COL);
if (mCursor.moveToPosition(position) && index != -1) {
return mCursor.getInt(index);
} else {
return NO_ID;
}
}
private static final class ViewHolder {
ImageView iv;
TextView tv;
int imageColIx;
int nameColIx;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder holder;
if (convertView == null) {
view = LayoutInflater.from(mContext).inflate(R.layout.tour_grid_item, null);
} else {
view = convertView;
}
if (view.getTag() == null || !(view.getTag() instanceof ViewHolder)) {
holder = new ViewHolder();
holder.iv = (ImageView)view.findViewById(R.id.tourGridItemIV);
holder.tv = (TextView)view.findViewById(R.id.tourGridItemTV);
holder.imageColIx = mCursor.getColumnIndex(GuideDBConstants.TourTable.ICON_LOC_COL);
holder.nameColIx = mCursor.getColumnIndex(GuideDBConstants.TourTable.NAME_COL);
view.setTag(holder);
} else {
holder = (ViewHolder)view.getTag();
}
if (mCursor.moveToPosition(position)) {
String imageLoc = null;
String name = null;
if (holder.imageColIx != -1) {
imageLoc = mCursor.getString(holder.imageColIx);
}
if (holder.nameColIx != -1) {
name = mCursor.getString(holder.nameColIx);
}
// For now we're not supporting tours with icons that need to be
// downloaded from the web. We will probably never need this
// functionality anyway.
int imageResource;
if (imageLoc == null) {
logger.warn("Row {} in tour cursor has a null image location. "
+ "Using default icon.", position);
imageResource = R.drawable.tour_placeholder;
} else {
String packageName = mContext.getApplicationContext().getPackageName();
imageResource = mContext.getResources().getIdentifier(imageLoc, "drawable",
packageName);
}
holder.iv.setImageResource(imageResource);
if (name == null) {
logger.warn("Row {} in tour cursor has a null tour name");
name = "Unnamed Tour";
}
holder.tv.setText(name);
} else {
throw new IndexOutOfBoundsException();
}
return view;
}
}