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

首頁 > 系統 > Android > 正文

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

2019-10-23 18:30:06
字體:
來源:轉載
供稿:網友

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));  } } 

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武强县| 和龙市| 卓尼县| 西峡县| 上思县| 泾源县| 通榆县| 阜南县| 蒙山县| 如皋市| 增城市| 册亨县| 镇原县| 五家渠市| 乐亭县| 岚皋县| 宁武县| 三穗县| 增城市| 阿巴嘎旗| 成都市| 勃利县| 辰溪县| 九龙城区| 汝阳县| 读书| 虎林市| 兴义市| 霸州市| 和龙市| 崇文区| 芦山县| 遵义市| 靖西县| 东方市| 葫芦岛市| 康乐县| 铁岭市| 偃师市| 吉安县| 高密市|