大家在做开发的时候,很多都需要用到滑动的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;
}
}