package com.example.XCar;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ListAdapter;
import android.widget.ListView;
/**
* Created with IntelliJ IDEA.
* User: S7
* Date: 13-7-22
* Time: 下午8:46
* To change this template use File | Settings | File Templates.
*/
public class AmazingListView extends ListView
implements AmazingAdapter.HasMorePagesListener
{
public static final String TAG = AmazingListView.class.getSimpleName();
private AmazingAdapter adapter;
boolean footerViewAttached = false;
public boolean isScrolling = false;
View listFooter;
private View mHeaderView;
private int mHeaderViewHeight;
private boolean mHeaderViewVisible;
private int mHeaderViewWidth;
public AmazingListViewScrollListener my_scrolling_listener;
public AmazingListView(Context paramContext)
{
super(paramContext);
}
public AmazingListView(Context paramContext, AttributeSet paramAttributeSet)
{
super(paramContext, paramAttributeSet);
}
public AmazingListView(Context paramContext, AttributeSet paramAttributeSet, int paramInt)
{
super(paramContext, paramAttributeSet, paramInt);
}
public void configureHeaderView(int position)
{
if(this.mHeaderView == null){
return;
}
int state = adapter.getPinnedHeaderState(position);
switch (state){
case AmazingAdapter.PINNED_HEADER_GONE:
mHeaderViewVisible = false;
break;
case AmazingAdapter.PINNED_HEADER_VISIBLE:
adapter.configurePinnedHeader(mHeaderView, position, 255);
if (mHeaderView.getTop() != 0) {
mHeaderView.layout(0, 0, mHeaderViewWidth, mHeaderViewHeight);
}
mHeaderViewVisible = true;
break;
case AmazingAdapter.PINNED_HEADER_PUSHED_UP:
View firstView = getChildAt(0);
if (firstView != null) {
int bottom = firstView.getBottom();
int headerHeight = mHeaderView.getHeight();
int y;
int alpha;
if (bottom < headerHeight) {
y = (bottom - headerHeight);
alpha = 255 * (headerHeight + y) / headerHeight;
} else {
y = 0;
alpha = 255;
}
adapter.configurePinnedHeader(mHeaderView, position, alpha);
if (mHeaderView.getTop() != y) {
mHeaderView.layout(0, y, mHeaderViewWidth, mHeaderViewHeight + y);
}
mHeaderViewVisible = true;
}
break;
}
}
protected void dispatchDraw(Canvas canvas)
{
super.dispatchDraw(canvas);
if (mHeaderViewVisible)
drawChild(canvas, mHeaderView, getDrawingTime());
}
public AmazingAdapter getAdapter()
{
return this.adapter;
}
public View getLoadingView()
{
return this.listFooter;
}
public boolean isLoadingViewVisible()
{
return this.footerViewAttached;
}
public void mayHaveMorePages()
{
if (! footerViewAttached && listFooter != null) {
this.addFooterView(listFooter);
footerViewAttached = true;
}
}
public void noMorePages()
{
if (this.listFooter != null)
removeFooterView(this.listFooter);
this.footerViewAttached = false;
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (mHeaderView != null) {
mHeaderView.layout(0, 0, mHeaderViewWidth, mHeaderViewHeight);
configureHeaderView(getFirstVisiblePosition());
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mHeaderView != null) {
measureChild(mHeaderView, widthMeasureSpec, heightMeasureSpec);
mHeaderViewWidth = mHeaderView.getMeasuredWidth();
mHeaderViewHeight = mHeaderView.getMeasuredHeight();
}
}
public void setAdapter(ListAdapter paramListAdapter)
{
if (!(paramListAdapter instanceof AmazingAdapter))
throw new IllegalArgumentException(AmazingListView.class.getSimpleName() + " must use adapter of type " + AmazingAdapter.class.getSimpleName());
if (this.adapter != null)
{
this.adapter.setHasMorePagesListener(null);
setOnScrollListener(null);
}
this.adapter = ((AmazingAdapter)paramListAdapter);
((AmazingAdapter)paramListAdapter).setHasMorePagesListener(this);
setOnScrollListener((AmazingAdapter)paramListAdapter);
View localView = new View(getContext());
super.addFooterView(localView);
super.setAdapter(paramListAdapter);
super.removeFooterView(localView);
requestLayout();
}
public void setLoadingView(View paramView)
{
this.listFooter = paramView;
}
public void setPinnedHeaderView(View paramView)
{
this.mHeaderView = paramView;
if (this.mHeaderView != null)
setFadingEdgeLength(0);
requestLayout();
}
public void setPinnedHeaderViewHeight(int paramInt)
{
this.mHeaderViewHeight = paramInt;
}
public void setScrollingListener(AmazingListViewScrollListener paramAmazingListViewScrollListener)
{
this.my_scrolling_listener = paramAmazingListViewScrollListener;
}
}
package com.example.XCar;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.SectionIndexer;
/**
* Created with IntelliJ IDEA.
* User: S7
* Date: 13-7-22
* Time: 下午8:47
* To change this template use File | Settings | File Templates.
*/
public abstract class AmazingAdapter extends BaseAdapter
implements SectionIndexer, AbsListView.OnScrollListener
{
public static final int PINNED_HEADER_GONE = 0;
public static final int PINNED_HEADER_PUSHED_UP = 2;
public static final int PINNED_HEADER_VISIBLE = 1;
public static final String TAG = AmazingAdapter.class.getSimpleName();
boolean automaticNextPageLoading = false;
HasMorePagesListener hasMorePagesListener;
int initialPage = 1;
int page = 1;
protected abstract void bindSectionHeader(View paramView, int paramInt, boolean paramBoolean);
public abstract void configurePinnedHeader(View paramView, int paramInt1, int paramInt2);
public abstract View getAmazingView(int paramInt, View paramView, ViewGroup paramViewGroup);
/**
* Computes the desired state of the pinned header for the given
* position of the first visible list item. Allowed return values are
* {@link #PINNED_HEADER_GONE}, {@link #PINNED_HEADER_VISIBLE} or
* {@link #PINNED_HEADER_PUSHED_UP}.
*/
public int getPinnedHeaderState(int position) {
if (position < 0 || getCount() == 0) {
return PINNED_HEADER_GONE;
}
// The header should get pushed up if the top item shown
// is the last item in a section for a particular letter.
int section = getSectionForPosition(position);
int nextSectionPosition = getPositionForSection(section + 1);
if (nextSectionPosition != -1 && position == nextSectionPosition - 1) {
return PINNED_HEADER_PUSHED_UP;
}
return PINNED_HEADER_VISIBLE;
}
public abstract int getPositionForSection(int paramInt);
public abstract int getSectionForPosition(int paramInt);
public abstract Object[] getSections();
public final View getView(int position, View convertView, ViewGroup parent)
{
/* View localView = getAmazingView(paramInt, paramView, paramViewGroup);
if ((paramInt == -1 + getCount()) && (this.automaticNextPageLoading))
onNextPageRequested(1 + this.page);
if (getPositionForSection(getSectionForPosition(paramInt)) == paramInt);
for (boolean bool = true; ; bool = false)
{
bindSectionHeader(localView, paramInt, bool);
return localView;
}*/
View res = getAmazingView(position, convertView, parent);
if (position == getCount() - 1 && automaticNextPageLoading) {
onNextPageRequested(page + 1);
}
final int section = getSectionForPosition(position);
boolean displaySectionHeaders = (getPositionForSection(section) == position);
bindSectionHeader(res, position, displaySectionHeaders);
return res;
}
public void nextPage()
{
this.page = (1 + this.page);
}
public void notifyMayHaveMorePages()
{
this.automaticNextPageLoading = true;
if (this.hasMorePagesListener != null)
this.hasMorePagesListener.mayHaveMorePages();
}
public void notifyNoMorePages()
{
this.automaticNextPageLoading = false;
if (this.hasMorePagesListener == null)
return;
this.hasMorePagesListener.noMorePages();
}
protected abstract void onNextPageRequested(int paramInt);
public void onScroll(AbsListView paramAbsListView, int paramInt1, int paramInt2, int paramInt3)
{
if (paramAbsListView instanceof AmazingListView)
((AmazingListView)paramAbsListView).configureHeaderView(paramInt1);
}
public void onScrollStateChanged(AbsListView view, int scrollState)
{
if(view instanceof AmazingListView){
if(scrollState != PINNED_HEADER_GONE){
((AmazingListView)view).isScrolling = true;
}else{
((AmazingListView)view).isScrolling = false;
}
}
if(((AmazingListView)view).my_scrolling_listener != null)
((AmazingListView)view).my_scrolling_listener.isScrolling();
/* if (paramAbsListView instanceof AmazingListView)
{
if (paramInt != 0)
break label20;
((AmazingListView)paramAbsListView).isScrolling = false;
}
do
{
return;
label20: ((AmazingListView)paramAbsListView).isScrolling = true;
}
while (((AmazingListView)paramAbsListView).my_scrolling_listener == null);
((AmazingListView)paramAbsListView).my_scrolling_listener.isScrolling();*/
}
public void resetPage()
{
this.page = this.initialPage;
}
void setHasMorePagesListener(HasMorePagesListener paramHasMorePagesListener)
{
this.hasMorePagesListener = paramHasMorePagesListener;
}
public void setInitialPage(int paramInt)
{
this.initialPage = paramInt;
}
public static abstract interface HasMorePagesListener
{
public abstract void mayHaveMorePages();
public abstract void noMorePages();
}
}