zoukankan      html  css  js  c++  java
  • Android之ScrollView嵌套ListView冲突

    在ScrollView中嵌套使用ListView,ListView只会显示一行多一点。两者进行嵌套,即会发生冲突。
    由于ListView本身都继承于ScrollView,一旦在ScrollView中嵌套ScrollView,
    那么里面的ScrollView高度计算就会出现问题。
    我们也就无法得到想要的效果。
    下面进入正题,我们将讨论ScrollView中嵌套ListView情况。
    核心解决方案: 重写ListView或者GridView的OnMesure 方法。对GridView同样适用。

    1. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    2. int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
    3. MeasureSpec.AT_MOST);
    4. super.onMeasure(widthMeasureSpec, expandSpec);
    5. }
    复制代码


    ScrollView中嵌套ListView:

    1. package com.android.xiaomolongstudio.example.scrollviewlistview;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. import android.app.Activity;
    5. import android.os.Bundle;
    6. import android.view.Menu;
    7. import android.widget.ArrayAdapter;
    8. import android.widget.ListView;
    9. /**
    10. * @author 小尛龙
    11. *
    12. */
    13. public class MainActivity extends Activity {
    14.         ListView listView;
    15.         @Override
    16.         protected void onCreate(Bundle savedInstanceState) {
    17.                 super.onCreate(savedInstanceState);
    18.                 setContentView(R.layout.activity_main);
    19.                 listView = (ListView) findViewById(R.id.listView);
    20.                 listView.setAdapter(new ArrayAdapter<String>(this,
    21.                                 android.R.layout.simple_expandable_list_item_1, getData()));
    22.         }
    23.         private List<String> getData() {
    24.                 List<String> data = new ArrayList<String>();
    25.                 for (int i = 0; i < 30; i++) {
    26.                         data.add("测试" + i);
    27.                 }
    28.                 return data;
    29.         }
    30.         @Override
    31.         public boolean onCreateOptionsMenu(Menu menu) {
    32.                 // Inflate the menu; this adds items to the action bar if it is present.
    33.                 getMenuInflater().inflate(R.menu.activity_main, menu);
    34.                 return true;
    35.         }
    36. }
    复制代码


    自定义ListView:

    1. package com.android.xiaomolongstudio.example.scrollviewlistview;
    2. import android.content.Context;
    3. import android.util.AttributeSet;
    4. import android.widget.ListView;
    5. public class MyListView extends ListView {
    6.         public MyListView(Context context) {
    7.                 super(context);
    8.         }
    9.         public MyListView(Context context, AttributeSet attrs) {
    10.                 super(context, attrs);
    11.         }
    12.         public MyListView(Context context, AttributeSet attrs, int defStyle) {
    13.                 super(context, attrs, defStyle);
    14.         }
    15.         @Override
    16.         protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    17.                 int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
    18.                                 MeasureSpec.AT_MOST);
    19.                 super.onMeasure(widthMeasureSpec, expandSpec);
    20.         }
    21. }
    复制代码

    没有上面的按钮,一进页面直接显示的是ListView内容,怎么一开始就显示头部。
    ScrollView有个属性mScrollView.scrollTo(x, y)可以显示位置。
    但是实际却没有达到效果,查了说mScrollView.scrollTo(x, y)首次初始化时无效果。
    最后我用了mScrollView.smoothScrollTo(0,0);

    参考:http://bbs.itheima.com/thread-128002-1-1.html

  • 相关阅读:
    EventHandler 与常见的.Net预定义委托
    Consistent Hashing算法及相关技术
    全序, 分布式一致性的本质
    Paxos Made Simple
    Strong Consistency, 强一致性技术概述
    Chubby lock service for looselycoupled distributed systems
    AntiEntropy Protocols
    Mesos: A Platform for FineGrained Resource Sharing in the Data Center
    Spark A FaultTolerant Abstraction for InMemory Cluster Computing
    Vector Clocks, 时间向量
  • 原文地址:https://www.cnblogs.com/manmanlu/p/4620358.html
Copyright © 2011-2022 走看看