Scrollview如何自适应Listview/GridView
来源:互联网 发布:jira切换数据库 编辑:程序博客网 时间:2024/06/16 20:47
前言
前段时间做了个项目是在一个搜索界面上方显示历史搜索记录,下方显示的是搜索出来的物品,需求是物品数量不确定所以需要使用ListView,可以滑动显示,又不可以只滑动物品,也要相应可以将上方的历史记录共同滑动隐藏,所以采用了ScrollView嵌套ListView的办法,结果就遇到坑了,并没有达到想要的效果,没有办法滑动,于是在网上查询各种资料,有数限制高度,有说自适应的,资料部分是从@张辉skywish,这里获取加上从朋友那得到的办法整理了一下
首先先介绍一下ScrollView
1.ScrollView 和HorizontalScrollView是为控件或者布局添加滚动条
2.上述的两个控件只能有一个孩子,但是它并不是传统上的容器
3.上述两个控件可以互相嵌套
4.ScrollView用于设置垂直滚动条,HorizontalScrollView用于设置水平滚动条,需要注意的是,有一个属性是scrollbars可以设置滚动条的方向但是ScrollView设置成horizontal是和设置成none效果相同的,HorizontalScrollView设置成vertical和none的效果相同.
public class ScrollerActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main5); }}
以上就是ScrollView的简单用法,那怎么去解决ScrollView嵌套ListView呢?请往下看,GridView与ListView类似就不多阐述了
问题解决方案:
1.手动在XML/代码中设置ListView高度(在xml设置不推荐),除非ListView的数据是不可变的,但要是不可变也没有必要非这么折腾了对吧 - -
/***动态设置ListView的高度*/public staticvoidsetListViewHeightBaseOnChildren(ListView listView){
if(listView ==null)return ;
ListAdapter listAdapter = listView.getAdapter();
if(listAdapter ==null)return ;
int totalHeight = 0 ;
for(int i = 0 ; i <listAdapter.getCount();i++)
{
View listItem = listAdapter.getView(i,null,listView);
listItem.measure(0,0);
totalHeight += listItem.getMeasureHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight +(listView.getDividerHeight()* (listAdapter.getCount()-1));
listView.setLayoutParams(params);
}
a.是Adapter中getView方法返回的View必须有LinearLayout组成,因为只用LinearLayout才有measure()方法,如果使用其他的布局如RelativeLayout,在调用listItem.measure(0,0);时就会抛异常,因为除LinearLayout外的其他布局的这个方法就是抛了异常的
b.是需要手动把ScrollView滚动至最顶端,因为使用这个方法,默认在ScrollView顶端的项是ListView
- <span style="font-family:KaiTi_GB2312;font-size:18px;"> <ListView
- android:id="@+id/act_solution_2_lv"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- </ListView>
- </span>
- <span style="font-family:KaiTi_GB2312;font-size:18px;"> public View getView(int position, View convertView, ViewGroup parent) {
- //列表第一项
- if(position == 0){
- convertView = inflater.inflate(R.layout.item_solution2_top, null);
- return convertView;
- }
- //列表最后一项
- else if(position == 21){
- convertView = inflater.inflate(R.layout.item_solution2_bottom, null);
- return convertView;
- }
- //普通列表项
- ViewHolder h = null;
- if(convertView == null || convertView.getTag() == null){
- convertView = inflater.inflate(R.layout.item_listview_data, null);
- h = new ViewHolder();
- h.tv = (TextView) convertView.findViewById(R.id.item_listview_data_tv);
- convertView.setTag(h);
- }else{
- h = (ViewHolder) convertView.getTag();
- }
- h.tv.setText("第"+ position + "条数据");
- return convertView;
- }
- </span>
- <span style="font-family:KaiTi_GB2312;font-size:18px;"> lv = (ListView) findViewById(R.id.act_solution_2_lv);
- adapter = new AdapterForListView2(this);
- lv.setAdapter(adapter);</span>
- <span style="font-family:KaiTi_GB2312;font-size:18px;"> import android.content.Context;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.View;
- import android.widget.BaseAdapter;
- import android.widget.LinearLayout;
- /**
- * 取代ListView的LinearLayout,使之能够成功嵌套在ScrollView中
- * @author terry_龙
- */
- public class LinearLayoutForListView extends LinearLayout {
- private BaseAdapter adapter;
- private OnClickListener onClickListener = null;
- /**
- * 绑定布局
- */
- public void bindLinearLayout() {
- int count = adapter.getCount();
- this.removeAllViews();
- for (int i = 0; i < count; i++) {
- View v = adapter.getView(i, null, null);
- v.setOnClickListener(this.onClickListener);
- addView(v, i);
- }
- Log.v("countTAG", "" + count);
- }
- public LinearLayoutForListView(Context context) {
- super(context);
- </span>
- <span style="font-family:KaiTi_GB2312;font-size:18px;"> <pm.nestificationbetweenscrollviewandabslistview.mywidgets.LinearLayoutForListView
- android:id="@+id/act_solution_3_mylinearlayout"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
- </pm.nestificationbetweenscrollviewandabslistview.mywidgets.LinearLayoutForListView>
- </span>
- <span style="font-family:KaiTi_GB2312;font-size:18px;"> mylinearlayout = (LinearLayoutForListView) findViewById(R.id.act_solution_3_mylinearlayout);
- adapter = new AdapterForListView(this);
- mylinearlayout.setAdapter(adapter);
- </span>
- <span style="font-family:KaiTi_GB2312;font-size:18px;"> import android.content.Context;
- import android.util.AttributeSet;
- import android.widget.ListView;
- 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 defStyle) {
- super(context, attrs, defStyle);
- }
- @Override
- /**
- * 重写该方法,达到使ListView适应ScrollView的效果
- */
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
- MeasureSpec.AT_MOST);
- super.onMeasure(widthMeasureSpec, expandSpec);
- }
- }
- 这个方法和方法1有一个同样的毛病,就是默认显示的首项是ListView,需要手动把ScrollView滚动至最顶端。
- </span>
- Scrollview如何自适应Listview/GridView
- ListView 与 GridView 在ScrollView中自适应高度
- 如何在ScrollView中嵌套ListView、ScrollView、EditText、GridView
- 如何在ScrollView中嵌套ListView、ScrollView、EditText、GridView
- ScrollView ListView GridView
- ScrollView中的ListView、GridView
- ScrollView嵌套GridView、ListView
- ScrollView嵌套ListView、GridView
- ScrollView 嵌套 ListView GridView
- pulltorefresh【listview GridView ScrollView】
- 如何在ScrollView中嵌套ListView和GridView
- ScrollView嵌套ListView或GridView等,使得其高度自适应解决方案
- ScrollView嵌套GridView和ListView
- listview、gridView、ScrollView 下拉刷新
- ScrollView中嵌套ListView,GridView
- GridView ListView 嵌套 ScrollView 解决方案
- android listview,GridView 和 ScrollView
- ScrollView嵌套ListView或gridview
- 030、java修饰符
- AES加密解密(ECB模式)
- Tensorflow-pb保存与导入
- Jack 服务编译问题 Android 7.0
- TYVJ 4865 天天和树tree || 清北学堂金秋杯大奖赛
- Scrollview如何自适应Listview/GridView
- (2)x210:change the physical meme addr to 30000000 in uboot
- poj 2334 Simple prefix compression(胡搞)
- 欢迎使用CSDN-markdown编辑器
- 线程基本概念
- cocosstudio3.10一些注意事项
- iOS 直播技术文档
- Swift 关于tabbar image渲染的问题
- 031、内部类