【需求分析】
最近项目中遇到这样一个需求,GridView在初始布局时有一个上面的padding。但是当滑动屏幕时,这个padding被动态填充,增大滑动区间和用户视觉区。折腾了好久,找到了相关属性android:clipToPadding可以进行设置。
【动画效果】
这里需要的效果是:起初ListView具有上方的padding,而在用户手动滑动ListView后,上滑动的内容可以填充进这部分padding中,具体如下所示:
如果不对android:clipToPadding进行设置,得到的动画效果如下:
此时,从动图中可以看出,ListView上方的padding一直存在于那边,并且当手动滑动listView时,item只是沿着padding的下边进行滑动,导致滑动后list_item和上面的actionBar好似分割开来了。通过添加android:clipToPadding=false这条属性,可以有效解决由于设置了padding导致的动态滑动分割影响。
【实现方案】
在ListView或者GridView中添加android:clipToPadding属性。
【代码展示】
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context="com.baidu.dynamicpadding.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="这是模拟出的actionBar"
android:textColor="#0000FF"
android:textSize="14sp"
android:gravity="center"
android:background="#FFFFFF"
/>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#000000"
/>
<ListView
android:id="@+id/test_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="20dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingBottom="20dp"
android:background="#333333"
android:clipToPadding="false"
/>
</LinearLayout>
public class MainActivity extends AppCompatActivity {
private ListView listItems = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
listItems = (ListView) findViewById(R.id.test_list);
List<String> datas = new ArrayList<>();
for (int i = 0; i < 30; ++i) {
datas.add(i, "item " + i);
}
ListAdapter adapter =
new ListAdapter(MainActivity.this, R.layout.list_item, datas);
listItems.setAdapter(adapter);
}
private class ListAdapter extends ArrayAdapter<String> {
private int resourceId;
public ListAdapter(Context context, int resourceId, List<String> datas) {
super(context, resourceId, datas);
this.resourceId = resourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(resourceId, null);
} else {
view = convertView;
}
TextView tvText = (TextView) view.findViewById(R.id.text_view);
tvText.setText(getItem(position));
return view;
}
}
}
【个人总结】
- 动态填充空白边距Padding:在ListView或者GridView中添加如下属性:
android:clipToPadding="false"
【原创声明】
转载请注册出处[个人博客地址](http://blog.youkuaiyun.com/csdn_lexli/article)