package com.google.code.appsorganizer.prova;
import java.util.ArrayList;
import android.content.Context;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.google.code.appsorganizer.R;
public class PageAdapter extends BaseAdapter {
private final Context context;
private final int itemRowResID;
private final int loadingRowResID;
int itemsLoaded;
int itemsToLoad;
boolean allItemsLoaded;
Boolean loading;
UIUpdateTask updateTask;
static final int PRELOAD_ITEMS = 30;
static final String LOG_TAG = "PAGEADAPTER";
DataSource dataSource;
ArrayList<String> items;
Handler uiHandler = new Handler();
public PageAdapter(Context context, int itemRowResID, int loadingRowResID) {
this.context = context;
this.itemRowResID = itemRowResID;
this.loadingRowResID = loadingRowResID;
dataSource = new DataSource();
itemsLoaded = 0;
itemsToLoad = 0;
items = new ArrayList<String>();
allItemsLoaded = false;
loading = Boolean.FALSE;
updateTask = new UIUpdateTask();
}
public int getCount() {
int count = itemsLoaded;
if (!allItemsLoaded) {
++count;
}
return count;
}
public Object getItem(int position) {
String result;
synchronized (items) {
result = items.get(position);
}
return result;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
boolean isLastRow = position >= itemsLoaded;
int rowResID = isLastRow ? loadingRowResID : itemRowResID;
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(rowResID, parent, false);
if (isLastRow) {
if (position < dataSource.getItemCount()) {
// Should there be more items loaded?
int nextItemToLoad = position + PRELOAD_ITEMS;
int allItemsToLoad = dataSource.getItemCount();
if (nextItemToLoad > allItemsToLoad) {
nextItemToLoad = allItemsToLoad;
}
Log.d(LOG_TAG, "nextItemToLoad: " + nextItemToLoad);
if (nextItemToLoad > itemsToLoad) {
itemsToLoad = nextItemToLoad;
Log.d(LOG_TAG, "itemsToLoad: " + itemsToLoad);
// Launch the loading thread if it is not currently running
synchronized (loading) {
if (!loading.booleanValue()) {
Log.d(LOG_TAG, "Staring loading task");
loading = Boolean.TRUE;
Thread t = new LoadingThread();
t.start();
Log.d(LOG_TAG, "Loading task started");
}
}
}
} else {
uiHandler.post(updateTask);
}
} else {
String item = items.get(position);
TextView itemControl = (TextView) v.findViewById(R.id.name);
if (itemControl != null) {
itemControl.setText(item);
}
}
return v;
}
@Override
public boolean areAllItemsEnabled() {
return true;
}
@Override
public boolean isEnabled(int position) {
return true;
}
class LoadingThread extends Thread {
@Override
public void run() {
int itemsOriginallyLoaded = 0;
synchronized (items) {
itemsOriginallyLoaded = items.size();
}
for (int i = itemsOriginallyLoaded; i < itemsToLoad; ++i) {
Log.d(LOG_TAG, "Loading item #" + i);
String item = dataSource.getItem(i);
synchronized (items) {
items.add(item);
}
itemsLoaded = i + 1;
uiHandler.post(updateTask);
Log.d(LOG_TAG, "Published item #" + i);
}
if (itemsLoaded >= (dataSource.getItemCount() - 1)) {
allItemsLoaded = true;
}
synchronized (loading) {
loading = Boolean.FALSE;
}
}
}
class UIUpdateTask implements Runnable {
public void run() {
Log.d(LOG_TAG, "Publishing progress");
notifyDataSetChanged();
}
}
}