zoukankan      html  css  js  c++  java
  • Android ScrollView 和ListView 一起使用的问题汇总

    1.ScrollView 嵌套 ListView  ,touch事件的截获问题。

    参考 http://www.cnblogs.com/lqminn/archive/2013/03/02/2940194.html
    http://blog.csdn.net/chaihuasong/article/details/17499799

    _scrollView.requestDisallowInterceptTouchEvent(true);

    这句话的意思是告诉scrollView,滚动的事件交给我处理。用完以后记得还回去

    _scrollView.requestDisallowInterceptTouchEvent(false);

    如果不设置回去,ScrollView将无法滚动了。

    2.ScrollView 滚动时,ListView的第一个条目是否处于显示状态?

    参考 http://stackoverflow.com/questions/4628800/android-how-to-check-if-a-view-inside-of-scrollview-is-visible

    boolean checkNeedRefresh() {
            Rect scrollBounds = new Rect();
            View firstChild = listView.getChildAt(0);
            _scrollView.getHitRect(scrollBounds);
            if (firstChild.getLocalVisibleRect(scrollBounds)) {
                // Any portion of the firstChild, even a single pixel, is within the
                // visible window
                return true;
            } else {
                // NONE of the firstChild is within the visible window
                return false;
            }
        }

    3. listView不能显示完整

    参考 http://blog.csdn.net/hahashui123/article/details/39177057
    http://blog.csdn.net/solomonxiang/article/details/26507145

    public static void setListViewHeight(ListView listView) {
            try {
                int totalHeight = 0;
                ListAdapter adapter = listView.getAdapter();
                for (int i = 0, len = adapter.getCount(); i < len; i++) { // listAdapter.getCount()
                    View listItem = adapter.getView(i, null, listView);
                    listItem.setLayoutParams(new LayoutParams(
                            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    
                    listItem.measure(0, 0); 
                    totalHeight += listItem.getMeasuredHeight(); 
                }
    
                ViewGroup.LayoutParams params = listView.getLayoutParams();
                params.height = totalHeight
                        + (listView.getDividerHeight() * (listView.getCount() - 1));
                listView.setLayoutParams(params);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

    顺带GridView

    public static void setGridViewHeight(GridView gridView, int numColumns) {
            try {
                ListAdapter adapter = gridView.getAdapter();
                int row = 3;
                View listItem = adapter.getView(0, null, gridView);
                if (listItem == null)
                    return;
                listItem.setLayoutParams(new LayoutParams(
                        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
                listItem.measure(0, 0); 
                int totalHeight = listItem.getMeasuredHeight() * row
                        + (gridView.getVerticalSpacing() * (row - 1));
                ViewGroup.LayoutParams params = gridView.getLayoutParams();
                params.height = totalHeight;
                gridView.setLayoutParams(params);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

     如果ListView 带有BottomView

    public static void setListViewHeight(ListView listView) {
            try {
                int totalHeight = 0;
                int bottomHeight = 0;
                ListAdapter dataAdapter = null;
                int totalItems = 0;
                ListAdapter adapter = listView.getAdapter();
                if (adapter instanceof HeaderViewListAdapter) {
                    HeaderViewListAdapter headerViewListAdapter = ((HeaderViewListAdapter) adapter);
                    dataAdapter = headerViewListAdapter.getWrappedAdapter();
                    totalItems = dataAdapter.getCount();
                    int allItems = headerViewListAdapter.getCount();
                    View bottomItem = headerViewListAdapter.getView(allItems - 1,
                            null, listView);
                    bottomItem.measure(0, 0);
                    bottomHeight = bottomItem.getMeasuredHeight();
    
                } else {
                    dataAdapter = adapter;
                }
    
                for (int i = 0, len = totalItems; i < len; i++) {
                    View listItem = dataAdapter.getView(i, null, listView);
                    listItem.setLayoutParams(new LayoutParams(
                            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    
                    listItem.measure(0, 0);
                    totalHeight += listItem.getMeasuredHeight();
                }
    
                int listviewCount = listView.getCount();
                int height = totalHeight
                        + (listView.getDividerHeight() * listviewCount + 1)
                        + bottomHeight;
    
                ViewGroup.LayoutParams params = listView.getLayoutParams();
                params.height = height;
                listView.setLayoutParams(params);
                listView.requestLayout();
                 
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

    4. 其他,自定义控件实现ListView

    http://www.cnblogs.com/lesliefang/p/3587154.html 

     5. 发现 每次加载完成后,listview总是滚到 屏幕最上方,实际上listview上面还有东西被盖住了,解决办法如下

      <ScrollView
            android:id="@+id/scrollView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:descendantFocusability="blocksDescendants"
                android:orientation="vertical" >

    最关键的一句, 找到srcollview的 内容控件,一般是 LinearLayout,加上属性  android:descendantFocusability="blocksDescendants"
    就可以了。

  • 相关阅读:
    原生searchView 自定义样式
    面试问题总结
    Android Studio开发环境搭建
    JAVA基本程序设计结构
    JAVA大数使用
    sql
    普通树的递归遍历
    6_43_递归交换二叉树中所有节点的左右子树
    6_42_二叉树递归求叶子节点个数
    6_44_二叉树中值为x的节点为根的子树的深度
  • 原文地址:https://www.cnblogs.com/xiaokang088/p/4184617.html
Copyright © 2011-2022 走看看