我想检测列表视图的顶部,我使用了这个方法。
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem == 0)
swipeRefreshLayout.setEnabled(true);
else
swipeRefreshLayout.setEnabled(false);
}
这个方法很好用,但问题是我把Header View也附加到了list上,当我向上滚动时,只要第一个项目是可见的(不是Header View),它就会调用pull来刷新list视图。当我向上滚动时,只要第一个项目可见(不是头视图),它就会调用拉动来刷新列表视图。我怎样才能检测到列表的头是完全可见的呢?
View imageSlider = inflater.inflate(R.layout.image_slider_layout, null, false);
findViewById(imageSlider);
mPullRefreshListView.addHeaderView(imageSlider);
private void findViewById(View view) {
mViewPager = (ViewPager) view.findViewById(R.id.view_pager);
mIndicator = (CirclePageIndicator) view.findViewById(R.id.indicator);
}
嗯,有趣的答案在于onTouch监听器,而不是onScroll,请看下面的实现,它准确地告诉你什么时候头是完全可见的,你可以进一步完善逻辑......这只是我的一个快速实现。
// Set a on touch listener for your list
mList.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
// get the top of first child
View mView = mList.getChildAt(0);
int top = mView.getTop();
switch(event.getAction()){
case MotionEvent.ACTION_MOVE:
// see if it top is at Zero, and first visible position is at 0
if(top == 0 && mList.getFirstVisiblePosition() == 0){
Toast.makeText(MainActivity.this, "Header Item Visible",
Toast.LENGTH_SHORT).show();
}
}
// dont forget to retrun false here
return false;
}
});
你也可以在onScroll Listener中用visibleitemCount简单地识别它。
首先确定你的listview的可见项数,在listview的顶部,包括头部。你可以通过烤面包或调试代码来获得这个计数。
在我的例子中,我的listview的正常可见项数是3,而顶部的可见项数是2(包括headerview),那么我的代码对我来说是有效的。
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if(firstVisibleItem==0&&visibleItemCount==2)
{
swp.setEnabled(true);
}
else{
swp.setEnabled(false);
}
}