package com.roboo.like.netease.view; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.view.ViewParent; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.FrameLayout; import android.widget.ListAdapter; import android.widget.ListView; import com.roboo.like.netease.adapter.SectionListAdapter; /** * View displaying the list with sectioned header. */ public class SectionListView extends ListView implements OnScrollListener { private View transparentView; public SectionListView(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); commonInitialisation(); } public SectionListView(final Context context, final AttributeSet attrs) { super(context, attrs); commonInitialisation(); } public SectionListView(final Context context) { super(context); commonInitialisation(); } protected final void commonInitialisation() { setOnScrollListener(this); setVerticalFadingEdgeEnabled(false); setFadingEdgeLength(0); } @Override public void setAdapter(final ListAdapter adapter) { if (!(adapter instanceof SectionListAdapter)) { throw new IllegalArgumentException( "The adapter needds to be of type " + SectionListAdapter.class + " and is " + adapter.getClass()); } super.setAdapter(adapter); final ViewParent parent = getParent(); if (!(parent instanceof FrameLayout)) { throw new IllegalStateException( "Section List should have FrameLayout as parent!"); } if (transparentView != null) { ((FrameLayout) parent).removeView(transparentView); } transparentView = ((SectionListAdapter) adapter) .getTransparentSectionView(); final FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); ((FrameLayout) parent).addView(transparentView, lp); if (adapter.isEmpty()) { transparentView.setVisibility(View.INVISIBLE); } } @Override public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) { final SectionListAdapter adapter = (SectionListAdapter) getAdapter(); if (adapter != null) { adapter.makeSectionInvisibleIfFirstInList(firstVisibleItem); } } @Override public void onScrollStateChanged(final AbsListView view, final int scrollState) { // do nothing } }