工具篇——ListViewForScrollView(解决ScrollView嵌套ListView,ListView显示不全的问题)

写代码的四点:
     1.明确需求。要做什么?
     2.分析思路。要怎么做?(1,2,3……)
     3.确定步骤。每一个思路要用到哪些语句、方法和对象。
     4.代码实现。用具体的语言代码将思路实现出来。

学习新技术的四点:
     1.该技术是什么?
     2.该技术有什么特点?(使用需注意的方面)
     3.该技术怎么使用?(写Demo)
     4.该技术什么时候用?(在Project中的使用场景 )

----------------------早计划,早准备,早完成。-------------------------

代码如下:

package com.wy.test.other;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;

/**
 * 解决ScrollView嵌套ListView,ListView显示不全的问题
 * 注意:ScrollView嵌套ListView时,如果ListView很长超出了屏幕的高度,
 * 那么ScrollView会自动滚动到ListView的顶部,
 * 但是我们需要默认在整体页面顶部,所以在初始化的时候就让ScrollView获得焦点,滚动条自然就显示到顶部了。
 * scrollView.setFocusable(true);
 * scrollView.setFocusableInTouchMode(true);
 * scrollView.requestFocus();
 */
public class ListViewForScrollView extends ListView {

    public ListViewForScrollView(Context context) {
        super(context);
    }

    public ListViewForScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ListViewForScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * 重写onMeasure方法,重新计算高度,达到使ListView适应ScrollView的效果
     *
     * @param widthMeasureSpec  宽度测量规则
     * @param heightMeasureSpec 高度测量规则
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //Integer.MAX_VALUE:表示int类型能够表示的最大值,值为2的31次方-1
        //>>2:右移N位相当于除以2的N的幂
        //MeasureSpec.AT_MOST:子布局可以根据自己的大小选择任意大小的模式
        int newHeightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, newHeightMeasureSpec);
    }
}


在项目中的应用:

1.在xml布局文件中直接使用;
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="none">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:text="页面需要从这里开始" />

            <com.wy.test.other.ListViewForScrollView
                android:id="@+id/lv"
                android:layout_width="match_parent"
                android:layout_height="match_parent"></com.wy.test.other.ListViewForScrollView>
        </LinearLayout>
    </ScrollView>
</LinearLayout>
2.注意:ScrollView嵌套ListView时,如果ListView很长超出了屏幕的高度,
             那么ScrollView会自动滚动到ListView的顶部,但是我们需要默认在
             整体页面顶部,所以在初始化的时候就让ScrollView获得焦点,
             滚动条自然就显示到顶部了。
package com.wy.test;

import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.ScrollView;

import butterknife.ButterKnife;
import butterknife.InjectView;

/**
 * ListViewForScrollView的使用
 */
public class ListViewForScrollViewActivity extends BaseActivity {

    @InjectView(R.id.lv)
    ListView lv;
    @InjectView(R.id.scrollView)
    ScrollView scrollView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listviewforscrollview);
        ButterKnife.inject(this);

        lv.setAdapter(baseAdapter);
        //让ScrollView获得焦点
        scrollView.setFocusable(true);
        scrollView.setFocusableInTouchMode(true);
        scrollView.requestFocus();
    }

    BaseAdapter baseAdapter = new BaseAdapter() {
        @Override
        public int getCount() {
            return 100;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            if (convertView == null) {
                convertView = View.inflate(getApplicationContext(), R.layout.item_gridviewforscrollview, null);
            }
            return convertView;
        }
    };
}



猜你喜欢

转载自blog.csdn.net/qq941263013/article/details/80237361
今日推荐