【问题标题】:ListView's items are not occupying the entire device spaceListView 的项目没有占用整个设备空间
【发布时间】:2015-11-22 20:18:04
【问题描述】:

我的 listView 包含 7 个项目。我希望这 7 个项目覆盖整个设备空间。

activity_main.xml:

   <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:context=".DaysList">


        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/listView"
            android:layout_gravity="center_vertical"
            >


        </ListView>
    </LinearLayout>

我的 onCreate() 方法:

   @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //setContentView(R.layout.activity_main);

            ListView listView=getListView();

            listView.setBackgroundColor(Color.GREEN);

            String[] values = new String[] { "Monday", "Tuesday", "Wednesday",
                    "Thursday","Friday", "Saturday","Sunday" };

            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, values);



            setListAdapter(adapter);
    }

预期输出:

实际输出:

【问题讨论】:

  • 如果你总是有 7 个项目,你应该使用带有 layout_weight 的垂直 LinearLayout 而不是 ListView
  • 您是否尝试将 listview 的 layout_height 从“match_parent”更改为“wrap_content”?
  • @fractalwrench 我使用了 android:orientation=vertical,结果还是一样。
  • @OrkunKoçyiğit 是的,我试过了
  • ListView 不能以这种方式工作,因为您可以在可见屏幕上平等地放置所有项目。您必须使用其他 Layout 而不是 ListView 来实现这一点。就像将 7 个 TextViews 放在一个 LinearLayout 中并设置所有 TextView 的 layout_weight=1

标签: android listview android-listview


【解决方案1】:

如果您有固定的项目数,则不需要 listView,而是需要一个简单的线性布局,其中包含 7 个 TextView,并为 Textviews 高度设置权重,例如:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="7">

    <TextView
        android:id="@+id/tv_monday"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="Monday" />

    <TextView
        android:id="@+id/tv_tuesday"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="Tuesday" />

    ...

</LinearLayout>

【讨论】:

    【解决方案2】:

    默认情况下,ListView 包含在具有无限高度的 ScrollView 中。因此,即使您仅将 listView 声明为包装内容,只要您的示例中存在空白空间,它就会填充整个内容。您可以在设置适配器后调用此方法来修复它:

    public boolean setListViewHeight(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter != null) {
    
            int numberOfItems = listAdapter.getCount();
    
            View item = listAdapter.getView(0, null, listView);
            item.measure(0, 0);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, numberOfItems * item.getMeasuredHeight());
            listView.setLayoutParams(params);
    
            return true;
    
        } else {
            return false;
        }
    }
    

    之前:

    之后:

    【讨论】:

      【解决方案3】:

      您可以创建一个自定义适配器来测量设备屏幕的高度并分散项目

      activity_main.xml

      <?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:id="@+id/linear_layout"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    tools:context=".DaysList">
          <ListView
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:id="@+id/listView"/>
      </LinearLayout>
      

      MainActivity.java

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
      
          final ListView listView = (ListView) findViewById(R.id.listView);
          listView.setBackgroundColor(Color.GREEN);
      
          String[] values = new String[]{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
      
          final ArrayAdapter<String> adapter = new Adapter(this, android.R.layout.simple_list_item_1, values);
          listView.setAdapter(adapter);
      }
      

      Adapter.java

      public class Adapter extends ArrayAdapter<String> {
      
          Context context;
          public Adapter(Context context, int textViewResourceId) {
              super(context, textViewResourceId);
              this.context = context;
          }
      
          public Adapter(Context context, int resource, String[] items) {
              super(context, resource, items);
              this.context = context;
          }
      
          @Override
          public View getView(int position, View convertView, ViewGroup parent) {
              View view = super.getView(position, convertView, parent);
      
              int fullHeight = parent.getHeight();
              int itemHeight = fullHeight / getCount() ;
      
              ViewGroup.LayoutParams lp = view.getLayoutParams();
              lp.height = itemHeight;
              view.setLayoutParams(lp);
      
              return view;
          }
      }
      

      【讨论】:

      • 我已经更新了我的答案。误解了你的问题。我的编辑将为您提供“覆盖整个设备空间”。希望对你有帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      相关资源
      最近更新 更多