相信大家都知道listview和scrollview在嵌套使用的时候会有一点点小问题,那就是在运行后只显示一行的问题。遇到这个问题该如何解决呢?当然在度娘那里肯定也有不少的答案【解决方案应该是五种】,但是我只推荐使用两种,这两种是我经常用到的,也是解决此问题最简单的两种。下面就边贴代码边阐述:
首先,我先介绍一下自定义list view的方法:
首先创建一个MyListView的类,用来自定义控件list view
- package com.example.acer_pc.listviewscrollview;
-
- import android.content.Context;
- import android.util.AttributeSet;
- import android.widget.ListView;
-
-
-
-
-
- public class MyListView extends ListView {
-
-
- public MyListView (Context context, AttributeSet attrs) {
-
- super(context, attrs);
-
- }
-
- public MyListView (Context context) {
-
- super(context);
-
- }
-
- public MyListView (Context context, AttributeSet attrs, int defStyle) {
-
- super(context, attrs, defStyle);
-
-
- }
-
-
- @Override
- public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
- super.onMeasure(widthMeasureSpec, expandSpec);
-
- }
-
-
- }
对于本类来说,还是很好理解的,下面请看XML中的布局
- <?xml version="1.0" encoding="utf-8"?>
- <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- xmlns:myapp="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
-
- <com.example.acer_pc.listviewscrollview.MyListView
- android:id="@+id/lview"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- />
记住listview是自定义的list view,一定要写对哦!
在Mainactivity中就很简单了,就是简单的查找控件,以及给listview控件设值。具体代码如下:
- package com.example.acer_pc.listviewscrollview;
-
- import android.os.Bundle;
- import android.support.v7.app.AppCompatActivity;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.Adapter;
- import android.widget.ArrayAdapter;
-
- import java.util.ArrayList;
-
- public class MainActivity extends AppCompatActivity {
- private ArrayList<String> list = new ArrayList<String>();
- private MyListView listView;
- private int height = 0;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- listView = (MyListView) findViewById(R.id.lview);
- for (int i = 0;i <= 50; i++){
- list.add( "第" + i + "数据");
- }
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
- listView.setAdapter(adapter);
-
- }
另外一种就是简单的计算listview控件的高度。【这种方法在eclipse中可以解决这个问题,但是在AS中没有效果,正在考虑why,欢迎各路大神提拔指点】XML中和上一种方法布局一样,只需将自定义的listview改为系统的list view控件就好了,然后在Activity中,首先查找控件listview,提供一个适配器给listview。然后对list view的高度进行计算,具体代码如下:
- package com.example.acer_pc.listviewscrollview;
-
- import android.os.Bundle;
- import android.support.v7.app.AppCompatActivity;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.Adapter;
- import android.widget.ArrayAdapter;
-
- import java.util.ArrayList;
-
- public class MainActivity extends AppCompatActivity {
- private ArrayList<String> list = new ArrayList<String>();
- private MyListView listView;
- private int height = 0;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- listView = (MyListView) findViewById(R.id.lview);
- for (int i = 0;i <= 50; i++){
- list.add( "第" + i + "数据");
- }
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
- listView.setAdapter(adapter);
- getListHeight(listView);
- }
- public void getListHeight(MyListView listview) {
- Adapter adapter = listview.getAdapter();
- for (int i = 0; i < adapter.getCount(); i++) {
- View view = adapter.getView(i, null, listview);
- view.measure(0,0);
- height += view.getMeasuredHeight();
- }
-
- int dividerHeight = listview.getDividerHeight() * (adapter.getCount() - 1);
- ViewGroup.LayoutParams params = listview.getLayoutParams();
- params.height = dividerHeight + height;
- listview.setLayoutParams(params);
- }
-
- }
这些呢,就是我对scrollview嵌套listview问题出现的一些解决方案和见解,如有问题或错误,欢迎各位大神指点。。。