package com.florianmski.tracktoid.ui.fragments.base.list;
import android.os.Bundle;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import com.florianmski.tracktoid.utils.Utils;
import com.florianmski.tracktoid.adapters.AbstractAdapter;
import com.florianmski.tracktoid.containers.ContainerInterface;
import java.util.ArrayList;
import java.util.List;
public abstract class ItemAbsListFragment<E, V extends AbsListView> extends ItemScrollFragment<E, List<E>, V, AbsListView.OnScrollListener, AbstractAdapter<E>> implements AdapterView.OnItemClickListener, AbsListView.OnScrollListener
{
protected int lastFirstVisibleItem;
protected int lastTop;
protected int scrollPosition;
protected int lastHeight;
protected int actionBarHeight;
public ItemAbsListFragment(ContainerInterface.ViewContainerInterface<E, V, AbstractAdapter<E>> viewContainer)
{
super(viewContainer);
data = new ArrayList<E>();
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
actionBarHeight = Utils.getActionBarHeight(getActivity());
getAbsListView().setOnItemClickListener(this);
getAbsListView().setOnScrollListener(this);
}
@Override
protected void refreshView(List<E> data)
{
getAdapter().refresh(data);
}
@Override
protected boolean isEmpty(List<E> data)
{
return data.isEmpty();
}
protected abstract AbstractAdapter<E> createAdapter(final List<E> items);
@Override
public void onViewCreated(View view, Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
viewContainer.setAdapter(createAdapter(data));
}
@Override
public void onDestroy()
{
super.onDestroy();
}
public V getAbsListView()
{
return getGroupView();
}
public E getItem(int position)
{
return data.get(position);
}
protected AbstractAdapter<E> getAdapter()
{
return viewContainer.getAdapter();
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
{
for(AbsListView.OnScrollListener listener : scrollListeners)
listener.onScrollStateChanged(view, scrollState);
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
for(AbsListView.OnScrollListener listener : scrollListeners)
listener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
// based on https://github.com/ManuelPeinado/GlassActionBar/blob/master/library/src/com/manuelpeinado/glassactionbar/ListViewScrollObserver.java
View firstChild = view.getChildAt(0);
if (firstChild == null)
return;
int top = firstChild.getTop();
int height = firstChild.getHeight();
int delta;
int skipped = 0;
if (lastFirstVisibleItem == firstVisibleItem)
delta = lastTop - top;
else if (firstVisibleItem > lastFirstVisibleItem)
{
skipped = firstVisibleItem - lastFirstVisibleItem - 1;
delta = skipped * height + lastHeight + lastTop - top;
}
else
{
skipped = lastFirstVisibleItem - firstVisibleItem - 1;
delta = skipped * -height + lastTop - (height + top);
}
boolean exact = skipped == 0;
scrollPosition += -delta;
onScrollUpDownChanged(-delta, scrollPosition, exact);
lastFirstVisibleItem = firstVisibleItem;
lastTop = top;
lastHeight = firstChild.getHeight();
}
protected void onScrollUpDownChanged(int delta, int scrollPosition, boolean exact)
{
// if we scrolled past the status bar
if(scrollPosition < 0 && delta < 0)
showActionBar(false);
else if(delta > 0)
showActionBar(true);
}
}