android listview的headview上下切换图片,Android PinnedHeaderListView如何切换(定位)到某一个Header?...

是一个仿写百度外卖的app,我在菜品的列表使用了PinnedHeaderListView这个开源库,列表生成已经没问题了(下图,关于流食也是牛肉大葱的bug已经修复,就不换图了),左边会有一排菜品分类的按钮:"面点"、"流食"、"凉菜"(暂时还没写,假设已经写好了),我想实现像Android电话本一样,比如我点击左边"流食"按钮,那么右边列表上"流食"就会上滚到顶端位置,应该怎么做呢?新手看不太懂源码。

地址是:https://github.com/JimiSmith/PinnedHeaderListView

bVmDKD

library中一共只有两个类,

其中PinnedHeaderListVie.java我觉得应该是这个功能相关的

public class PinnedHeaderListView extends ListView implements OnScrollListener {

private OnScrollListener mOnScrollListener;

public static interface PinnedSectionedHeaderAdapter {

public boolean isSectionHeader(int position);

public int getSectionForPosition(int position);

public View getSectionHeaderView(int section, View convertView, ViewGroup parent);

public int getSectionHeaderViewType(int section);

public int getCount();

}

private PinnedSectionedHeaderAdapter mAdapter;

private View mCurrentHeader;

private int mCurrentHeaderViewType = 0;

private float mHeaderOffset;

private boolean mShouldPin = true;

private int mCurrentSection = 0;

private int mWidthMode;

private int mHeightMode;

public PinnedHeaderListView(Context context) {

super(context);

super.setOnScrollListener(this);

}

public PinnedHeaderListView(Context context, AttributeSet attrs) {

super(context, attrs);

super.setOnScrollListener(this);

}

public PinnedHeaderListView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

super.setOnScrollListener(this);

}

public void setPinHeaders(boolean shouldPin) {

mShouldPin = shouldPin;

}

@Override

public void setAdapter(ListAdapter adapter) {

mCurrentHeader = null;

mAdapter = (PinnedSectionedHeaderAdapter) adapter;

super.setAdapter(adapter);

}

@Override

public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

if (mOnScrollListener != null) {

mOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);

}

if (mAdapter == null || mAdapter.getCount() == 0 || !mShouldPin || (firstVisibleItem < getHeaderViewsCount())) {

mCurrentHeader = null;

mHeaderOffset = 0.0f;

for (int i = firstVisibleItem; i < firstVisibleItem + visibleItemCount; i++) {

View header = getChildAt(i);

if (header != null) {

header.setVisibility(VISIBLE);

}

}

return;

}

firstVisibleItem -= getHeaderViewsCount();

int section = mAdapter.getSectionForPosition(firstVisibleItem);

int viewType = mAdapter.getSectionHeaderViewType(section);

mCurrentHeader = getSectionHeaderView(section, mCurrentHeaderViewType != viewType ? null : mCurrentHeader);

ensurePinnedHeaderLayout(mCurrentHeader);

mCurrentHeaderViewType = viewType;

mHeaderOffset = 0.0f;

for (int i = firstVisibleItem; i < firstVisibleItem + visibleItemCount; i++) {

if (mAdapter.isSectionHeader(i)) {

View header = getChildAt(i - firstVisibleItem);

float headerTop = header.getTop();

float pinnedHeaderHeight = mCurrentHeader.getMeasuredHeight();

header.setVisibility(VISIBLE);

if (pinnedHeaderHeight >= headerTop && headerTop > 0) {

mHeaderOffset = headerTop - header.getHeight();

} else if (headerTop <= 0) {

header.setVisibility(INVISIBLE);

}

}

}

invalidate();

}

@Override

public void onScrollStateChanged(AbsListView view, int scrollState) {

if (mOnScrollListener != null) {

mOnScrollListener.onScrollStateChanged(view, scrollState);

}

}

private View getSectionHeaderView(int section, View oldView) {

boolean shouldLayout = section != mCurrentSection || oldView == null;

View view = mAdapter.getSectionHeaderView(section, oldView, this);

if (shouldLayout) {

// a new section, thus a new header. We should lay it out again

ensurePinnedHeaderLayout(view);

mCurrentSection = section;

}

return view;

}

private void ensurePinnedHeaderLayout(View header) {

if (header.isLayoutRequested()) {

int widthSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth(), mWidthMode);

int heightSpec;

ViewGroup.LayoutParams layoutParams = header.getLayoutParams();

if (layoutParams != null && layoutParams.height > 0) {

heightSpec = MeasureSpec.makeMeasureSpec(layoutParams.height, MeasureSpec.EXACTLY);

} else {

heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);

}

header.measure(widthSpec, heightSpec);

header.layout(0, 0, header.getMeasuredWidth(), header.getMeasuredHeight());

}

}

@Override

protected void dispatchDraw(Canvas canvas) {

super.dispatchDraw(canvas);

if (mAdapter == null || !mShouldPin || mCurrentHeader == null)

return;

int saveCount = canvas.save();

canvas.translate(0, mHeaderOffset);

canvas.clipRect(0, 0, getWidth(), mCurrentHeader.getMeasuredHeight()); // needed

// for

// <

// HONEYCOMB

mCurrentHeader.draw(canvas);

canvas.restoreToCount(saveCount);

}

@Override

public void setOnScrollListener(OnScrollListener l) {

mOnScrollListener = l;

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

mWidthMode = MeasureSpec.getMode(widthMeasureSpec);

mHeightMode = MeasureSpec.getMode(heightMeasureSpec);

}

public void setOnItemClickListener(PinnedHeaderListView.OnItemClickListener listener) {

super.setOnItemClickListener(listener);

}

public static abstract class OnItemClickListener implements AdapterView.OnItemClickListener {

@Override

public void onItemClick(AdapterView> adapterView, View view, int rawPosition, long id) {

SectionedBaseAdapter adapter;

if (adapterView.getAdapter().getClass().equals(HeaderViewListAdapter.class)) {

HeaderViewListAdapter wrapperAdapter = (HeaderViewListAdapter) adapterView.getAdapter();

adapter = (SectionedBaseAdapter) wrapperAdapter.getWrappedAdapter();

} else {

adapter = (SectionedBaseAdapter) adapterView.getAdapter();

}

int section = adapter.getSectionForPosition(rawPosition);

int position = adapter.getPositionInSectionForPosition(rawPosition);

if (position == -1) {

onSectionClick(adapterView, view, section, id);

} else {

onItemClick(adapterView, view, section, position, id);

}

}

public abstract void onItemClick(AdapterView> adapterView, View view, int section, int position, long id);

public abstract void onSectionClick(AdapterView> adapterView, View view, int section, long id);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值