- 一前言
- 二java代码使用布局
- 三总结
一、前言
Android的界面布局可以用两种方法,一种是在xml中布局,一种是在JAVA代码中实现界面的布局。前者布局是很方便的,但是对于需要动态的显示界面,这个时候xml就缺少了一种灵活性。有一个需求:针对listView或者RecyclerView进行下拉刷新和上拉加载更多的时候,我们页面需要安卓qq那种:下拉刷新的listView或者RecyclerView上面嵌上一个搜索框。
项目中这个地方用的是listView,因此最简单的方法可能就是在为组件绑定adapter之前,使用listView的addHeadView方法动态添加一个组件。
值得注意的是:addHeadView必须在为组件绑定adapter之前
二、java代码使用布局
1.
TextView myTextView = new TextView(this);
myTextView.setText("我是搜索框");
myTextView.setTextSize(15);
myTextView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
listView.addHeaderView(myTextView);
1.但是报错LinearLayout.LayoutParams不能转换为AbsListView.LayoutParams,当时写成 LinearLayout.LayoutParams就是凭感觉猜的。
2. 一般的布局比如 LinearLayout和RelativeLayout代码中布局除了setLayoutParams还有一种方法void addView(View, LayoutParams)
于是将LinearLayout.LayoutParams改成AbsListView.LayoutParams,但是发现后者只有构造函数中只有两个参数,分别是width和height。这样从运行结果来看这个textview只能靠在左边。我要的效果是该textview在listview的item中居中,就像上面的那幅图片中搜索那样。
-
由于使用了listView的原因,我们LayoutParams只能是AbsListView.LayoutParams。对组件设置AbsListView.LayoutParams只有构造参数中提供的宽高,这是无法自由布局的。比如控制居中。
我们可以换个思路。我们在放入listView的item变成TextView外面套一层布局。在该布局(search_refresh_layout.xml)中我们可以自由控制TextView的显示:居中、padding之类的。对该布局设置AbsListView.LayoutParams: rl_tv_search.setLayoutParams(params);就ok了。代码如下:
ViewGroup rl_tv_search = (ViewGroup) LayoutInflater.from(this).inflate(R.layout.search_refresh_layout,null);
AbsListView.LayoutParams params = new AbsListView.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
rl_tv_search.setLayoutParams(params);
listView.addHeaderView(rl_tv_search);
listView.setAdapter(adapter);
其中search_refresh_layout.xml中
<?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="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:text="我是搜索框"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:layout_centerHorizontal="true"/>
</RelativeLayout>
效果图如下:
之前的这个我是搜索框是靠左边的,现在居中
三、总结
- java代码中两种设置布局的方法,一种是setLayoutParams,另外一种是addView(View, LayoutParams)前者是通用的,后者是ViewGroup才有的,因为addView吗只有group才可以。
- listView的addHeadView方法必须在为组件绑定adapter之前
- lsitView添加的头部自由布局还是嵌套一层LinearLayout之类的布局,比较方便。