最近在做一個項目需要在listView中嵌套viewPager作爲第一項,效果如下:
上面的佈局就是一個listView,在實現過程中遇到了以下問題:
1.listView中第一項爲viewPager,其他項爲單獨包含兩種數據類型,導致listView佈局混亂。
2.viewPager與listView的滑動衝突
3.viewPager的監聽器在viewPager切換的時候,進入了onPageChang方法但界面上沒有顯示相應的頁碼刷新。
針對問題1,查資料後發現當listView中的item類型超過一項時,需要重載方法
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return position > 0 ? 0 : 1;
}
針對問題2,上網搜索後發現了兩種解決辦法:
(1)重寫listView
public class MyListView extends ListView {
private GestureDetector mGestureDetector;
View.OnTouchListener mGestureListener;
public MyListView(Context context) {
super(context);
}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
mGestureDetector = new GestureDetector(new YScrollDetector());
setFadingEdgeLength(0);
}
public MyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);
}
class YScrollDetector extends SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if(distanceY!=0&&distanceX!=0){
}
if(Math.abs(distanceY) >= Math.abs(distanceX)) {
return true;
}
return false;
}
}
}
(2)重寫ViewPager
public class MyViewPager extends ViewPager {
public MyViewPager(Context context) {
super(context);
}
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
getParent().requestDisallowInterceptTouchEvent(true);//這句話的作用 告訴父view,我的單擊事件我自行處理,不要阻礙我。
return super.dispatchTouchEvent(ev);
}
}
上面兩種方法可以解決listView和ViewPager的滑動問題,注意需要固定ViewPager的高度,才能在listView中完整的顯示出來。
針對問題3
發現我把viewPager的監聽器寫在了listView的getView中,導致多次加載監聽器,出現監聽器不管用的問題。把OnPageChangeListener監聽器放在初始化的時候就可以正常刷新了。
demo下載地址:http://download.csdn.net/detail/zglslyg/7270961
有不清楚的可以留言。