国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android ListView與ScrollView沖突的解決方法總結

2019-12-12 02:58:53
字體:
來源:轉載
供稿:網友

Android ListView與ScrollView沖突的解決方法總結

眾所周知ListView與ScrollView都具有滾動能力,對于這樣的View控件,當ScrollView與ListView相互嵌套會成為一種問題:

 問題一:ScrollView與ListView嵌套導致ListView顯示不全面

 問題二:ScrollView不能正常滑動

解決方式一:

ScrollView+LinearLayout+ListView可以換成ScrollView+LinearLayout+LinearLayout,對于開發中,ScrollView所能滾動的樣式形式各異,另外的話,ScrollView所顯示的內容肯定不會太多,因此這種方案是合理而且可選的

解決方式二:

同樣是替換:ListView具有HeaderView與FooterView2部分,因此,在非下拉刷新,上拉加載的需求中,完全可以使用ListView來代替ScrollView,因此是合理可選的方案

解決方式三:

主動計算和設置ListView的高度,這樣的結果最終得出類似解決方案一效果,具體來說缺點是大材小用,但也是合理的解決辦法。

public class Utility {     public static void setListViewHeightBasedOnChildren(ListView listView) {       ListAdapter listAdapter = listView.getAdapter();        if (listAdapter == null) {         return;       }        int totalHeight = 0;       for (int i = 0; i < listAdapter.getCount(); i++) {         View listItem = listAdapter.getView(i, null, listView);         listItem.measure(0, 0);         totalHeight += listItem.getMeasuredHeight();       }        ViewGroup.LayoutParams params = listView.getLayoutParams();       params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));       listView.setLayoutParams(params);     }   } 

解決方式四:

復寫ScrollView,從事件方向進行處理,缺點是靈活性不夠好、

public class ListScrollView extends ScrollView {  private List list = new ArrayList();  private int scrollPaddingTop; // scrollview的頂部內邊距  private int scrollPaddingLeft;// scrollview的左側內邊距  private int[] scrollLoaction = new int[2]; // scrollview在窗口中的位置  private final static int UPGLIDE = 0;  private final static int DOWNGLIDE = 1;  private int glideState;  public ListScrollView(Context context, AttributeSet attrs) {  super(context, attrs);  }  private int downY = 0;  private int moveY = 0;    @Override  public boolean dispatchTouchEvent(MotionEvent ev) {  switch (ev.getAction()) {  case MotionEvent.ACTION_DOWN:   downY = (int) ev.getY();   //System.out.println("actiondown" + ev.getY());   break;  case MotionEvent.ACTION_MOVE:   moveY= (int) ev.getY();   //System.out.println("move" + moveY + "down" + downY);   if((moveY - downY) >= 0) {   //System.out.println("'''''''''DOWNGLIDE'''''''''''");   glideState = DOWNGLIDE;   } else {   //System.out.println("'''''''''UPGLIDE'''''''''''");   glideState = UPGLIDE;   }   break;  case MotionEvent.ACTION_UP:  default:   break;  }  return super.dispatchTouchEvent(ev);  }  @Override  public boolean onInterceptTouchEvent(MotionEvent ev) {  // 該事件的xy是以scrollview的左上角為00點而不是以窗口為00點  int x = (int) ev.getX() + scrollLoaction[0];  int y = (int) ev.getY() + scrollLoaction[1];  for (int i = 0; i < list.size(); i++) {   ListView listView = list.get(i);   int[] location = new int[2];   listView.getLocationInWindow(location);   int width = listView.getWidth();   int height = listView.getHeight();   // 在listview的位置之內則可以滑動   if (x >= location[0] + scrollPaddingLeft    && x <= location[0] + scrollPaddingLeft + width    && y >= location[1] + scrollPaddingTop    && y <= location[1] + scrollPaddingTop + height) {   //System.out.println(glideState);   if(( (listView.getLastVisiblePosition() == (listView.getCount()-1)) && (glideState == UPGLIDE) ) ) {    //System.out.println("up");    break;   }   if(( (listView.getFirstVisiblePosition() == 0) && (glideState == DOWNGLIDE))) {    //System.out.println("down");    break;   }   return false; //讓子控件直接處理   }  }  return super.onInterceptTouchEvent(ev);  }  @Override  public boolean onTouchEvent(MotionEvent ev) {  return super.onTouchEvent(ev);  }      private void findAllListView(View view) {  if (view instanceof ViewGroup) {   int count = ((ViewGroup) view).getChildCount();   for (int i = 0; i < count; i++) {   if (!(view instanceof ListView)) {    findAllListView(((ViewGroup) view).getChildAt(i));   }   }   if (view instanceof ListView) {   list.add((ListView) view);   }  }  }  @Override  protected void onDraw(Canvas canvas) {  super.onDraw(canvas);  scrollPaddingTop = getTop();  scrollPaddingLeft = getLeft();  getLocationInWindow(scrollLoaction);  }  @Override  protected void onLayout(boolean changed, int l, int t, int r, int b) {  super.onLayout(changed, l, t, r, b);  if (this.getChildCount() != 1) {   try {   throw new ScrollException();   } catch (ScrollException e) {   e.printStackTrace();   }  }  list.clear();  findAllListView(this.getChildAt(0));  } } 

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南乐县| 张家港市| 昭平县| 凤城市| 北宁市| 嘉定区| 景谷| 青神县| 云安县| 九寨沟县| 长垣县| 博罗县| 阳东县| 聂荣县| 惠水县| 绵阳市| 溧阳市| 潞西市| 樟树市| 简阳市| 无锡市| 高要市| 治多县| 鲜城| 鄂伦春自治旗| 南漳县| 海丰县| 蒲城县| 泸定县| 襄城县| 巴彦县| 迁安市| 易门县| 松原市| 宾川县| 溧阳市| 淮阳县| 安康市| 焉耆| 樟树市| 五华县|