/*
* Copyright 2011 Qubling Software, LLC.
*
* This software may be distributed under the terms of the Artistic License 2.0.
*/
package com.qubling.sidekick.widget;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.qubling.sidekick.R;
import com.qubling.sidekick.instance.Module;
import com.qubling.sidekick.search.ResultSet;
import com.qubling.sidekick.search.Search;
/**
* This is a {@link BaseAdapter} for displaying module information in a list
* view.
*
* @author sterling
*
*/
public class ModuleListAdapter extends BaseAdapter {
private int VIEW_TYPE_MODULE = 0;
private int VIEW_TYPE_LOAD_MORE = 1;
private int VIEW_TYPE_COUNT = 2;
private Search<Module> search;
private LayoutInflater inflater;
private int moduleLayout;
private int currentModule = -1;
private View loadMoreItemsRow;
public ModuleListAdapter(Context context, Search<Module> search, int moduleLayout) {
this.inflater = LayoutInflater.from(context);
this.search = search;
this.moduleLayout = moduleLayout;
}
public ModuleListAdapter(Context context, Search<Module> search) {
this(context, search, R.layout.module_list_item);
}
private ResultSet<Module> getResultSet() {
return search != null ? search.getResultSet() : null;
}
private boolean hasMoreItems() {
ResultSet<Module> results = getResultSet();
return results.getTotalSize() > results.size();
}
@Override
public int getCount() {
if (getResultSet() == null)
return 0;
return getResultSet().size() + (hasMoreItems() ? 1 : 0);
}
@Override
public int getItemViewType(int position) {
if (hasMoreItems() && position == getResultSet().size()) {
return VIEW_TYPE_LOAD_MORE;
}
else {
return VIEW_TYPE_MODULE;
}
}
@Override
public int getViewTypeCount() {
return VIEW_TYPE_COUNT;
}
private void requestMoreItems() {
search.fetchMore();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ResultSet<Module> results = getResultSet();
// Return the load more items row
if (hasMoreItems() && position == results.size()) {
requestMoreItems();
return getLoadMoreItemsRow(parent);
}
// How does this happen?
if (position == results.size()) {
Log.e("ModuleList", "the load items position was requested but shouldn't have been");
return null;
}
// Otherwise, start working on a regular row
// Try to convert, if we can
View row = convertView;
if (row == null) {
row = inflater.inflate(moduleLayout, null);
}
if (position == currentModule) {
row.setBackgroundResource(R.drawable.listitem_background_picked);
}
else {
row.setBackgroundResource(android.R.color.transparent);
}
// Get the module for this position
Module item = getItem(position);
// Update it using the helper procedure
ModuleHelper.updateItem(row, item);
// Return the module item view
return row;
}
private View getLoadMoreItemsRow(ViewGroup parent) {
// Use the one already made, if we've been here
if (loadMoreItemsRow != null)
return loadMoreItemsRow;
// Otherwise make one and cache it
return loadMoreItemsRow = inflater.inflate(R.layout.module_list_load_more, parent, false);
}
@Override
public Module getItem(int position) {
ResultSet<Module> results = getResultSet();
if (position < results.size())
return results.get(position);
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
return false;
}
public void setCurrentModule(int currentModule) {
this.currentModule = currentModule;
notifyDataSetChanged();
}
public int setCurrentModule(Module module) {
int currentModule = getResultSet().indexOf(module);
this.currentModule = currentModule;
notifyDataSetChanged();
return currentModule;
}
public void setSearch(Search<Module> search) {
this.search = search;
notifyDataSetChanged();
}
public int getCurrentModule() {
return currentModule;
}
}