android解决NestedScrollView和ListView冲突问题

大家在做开发的时候,很多都需要用到滑动的scrollview,但是会出现卡顿和滑动的事件冲突问题

注意在app下面的builder文件中添加依赖,不然无法使用控件

compile 'com.android.support.constraint:constraint-layout:1.0.2'

本博客实现一个常见的手机效果,图片加listview显示,效果图 如下所示:

(1)新建item ,用于自定义的listview效果

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp" >

    <ImageView
        android:id="@+id/iv"
        android:layout_width="80dp"
        android:layout_height="90dp"
        android:layout_centerVertical="true"
        android:padding="5dp"
        android:scaleType="centerCrop"
        android:src="@mipmap/e" />

    <TextView
        android:id="@+id/title"
        android:layout_marginLeft="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_toRightOf="@id/iv"
        android:gravity="center_vertical"
        android:text="人社部:养老转移已有初稿"
        android:textSize="14sp"
        android:textStyle="bold" />


    <EditText
        android:id="@+id/summary"
        android:layout_below="@id/title"
        android:layout_marginTop="8dp"
        android:layout_toRightOf="@id/iv"
        android:layout_width="220dp"
        android:layout_height="40dp"
        android:layout_marginLeft="10dp"
        android:hint="请输入数量"
        android:inputType="textCapCharacters"
        android:singleLine="true"
        android:maxLength="13"
        android:textSize="15sp"/>


</RelativeLayout>

(2)在activity_main,写我们的布局效果,含listivw和图片

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:src="@mipmap/a"
            android:scaleType="fitXY"
            />

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:src="@mipmap/b"
            android:scaleType="fitXY"
            />



        <ImageView
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:src="@mipmap/c"
            android:scaleType="fitXY"
            />

        <ListView
            android:id="@+id/lisview"
            android:layout_width="match_parent"
            android:layout_height="100dp"/>

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:src="@mipmap/d"
            android:scaleType="fitXY"
            />
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

(3)如果你只是在MainActivity代码里,简单的加载布局和配置适配器,那么会导致listview显示不全

import android.content.Context;
        import android.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.support.v7.widget.AppCompatTextView;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.ViewGroup;
        import android.widget.BaseAdapter;
        import android.widget.ListAdapter;
        import android.widget.ListView;
        import android.widget.TextView;

/**
 问题描述:
 1)  在android.support.v4.widget.NestedScrollView中直接嵌套ListView时出现的情况:listview显示不全只有一行或者两行。
 2) 如果listview的item中有根据id选择选项会导致选择错乱,如果listview中包含有switch控件,
 用来对该item是否可用进行判断,但是现在冲突导致的listview中位置错乱。
 2.解决方法:   计算出每一个item的高度,此方法用在listview.setAdapter()后。
 */

public class MainActivity extends AppCompatActivity {
    //参考网址:https://www.cnblogs.com/yuzhongzheng/p/5228401.html
    private MyAdapter adapter;
    private int totalHeight = 0;  //定义总高度


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView listview = (ListView) findViewById(R.id.lisview);
        adapter = new MyAdapter(this);
        if (adapter==null){
            return;
        }
        //根据listAdapter.getCount()获取当前拥有多少个item项,
        // 然后进行遍历对每一个item获取高度再相加最终获得总的高度。
        for (int i=0;i<adapter.getCount();i++){
            View listitem = adapter.getView(i,null,listview);
            listitem.measure(0,0);
            totalHeight += listitem.getMeasuredHeight();
        }
        //获取到list的布局属性
        ViewGroup.LayoutParams params = listview.getLayoutParams();
        //listview最终高度为item的高度+分隔线的高度,这是重新设置listview的属性
        params.height = totalHeight + (listview.getDividerHeight()*(adapter.getCount()-1));
        //将重新设置的params再应用到listview中
        listview.setLayoutParams(params);
        listview.setAdapter(adapter);
    }
}

class MyAdapter extends BaseAdapter {
    Context context;

    public MyAdapter(Context context) {
        super();
        this.context = context;
    }


    @Override
    public int getCount() {
        return 10;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = LayoutInflater.from(context).inflate(R.layout.item,null);
        return view;
    }

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

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

猜你喜欢

转载自blog.csdn.net/cf8833/article/details/81748933