【问题标题】:How to get ListView to grow to the size of content如何让 ListView 增长到内容的大小
【发布时间】:2010-03-15 21:11:13
【问题描述】:

所以我有一个相当复杂的活动,父级是一个带有一些基本信息和按钮的表格的线性布局。然后是几个用户可以添加项目的列表视图。因此,随着用户使用应用程序,这些列表视图会越来越多。我遇到的问题是 Linearlayout 比屏幕的分辨率大,所以它需要滚动。所以滚动在 Listviews 上不起作用。我试过改变 listview 的 layout_height 及其子元素,但没有成功。有没有办法让这些情侣列表视图扩展到孩子的数量?还是我对这一切都错了?如果可以,我还可以使用哪些其他控件?

我愿意接受任何想法。我真的不知道该怎么做。

谢谢

【问题讨论】:

    标签: android listview


    【解决方案1】:

    我遇到的问题是 线性布局比 屏幕的分辨率等等 需要滚动。所以滚动 不适用于列表视图。

    您需要重新考虑构建 UI 的方式,因为 ListViews 不能包含在 ScrollView 中。

    一种可能性是将所有内容放在ListView 中,将某些行标记为不可点击,以便ListView 处理您的滚动。对于这种情况,您可以使用我的MergeAdapter。

    【讨论】:

    • 所以我的列表上方有一个非常复杂的视图。它全部在一个 xml 视图中定义,我将如何将这些组件添加到 MergeAdapter 中?我应该在运行时创建所有控件吗?或者我应该怎么做?
    • 定义一个布局 XML 文件,其中包含应该在常规适配器内容之前进入 ListView 的内容。在运行时使用getLayoutInflater().inflate() 膨胀它。将View 添加到MergeAdapter,然后添加您的常规Adapter。然后将MergeAdapter 放入ListView。一旦你有这个工作,扩展 MergeAdapter 以覆盖正确的方法,以表明你的第一“行”是不可选择/不可点击的。
    【解决方案2】:

    如果您有一个简单的布局,那么您可以用LinearLayout 替换您的ListView 组件,并手动将您需要添加/删除并单击其中的项目的功能一起编程。

    这是我自己的一个简单示例。 refreshStudentList() 取代了在适配器上调用的 notifyDataSetChanged(),recentConnections 是 LinearLayout 和 adapter 是 Adapter 的一个实例(您可以使用您用于 @987654329 的适配器@):

    private void refreshStudentList() {
        recentConnections.removeAllViews();
    
        for(int i=0; i < adapter.getCount(); i++) {
            View toAdd = adapter.getView(i, null, recentConnections);
            final int position = i;
            toAdd.setOnClickListener(new OnClickListener() {
    
                public void onClick(View v) {
                    // onItemClick functionality here
                }
            });
    
            recentConnections.addView(toAdd, new LayoutParams(LayoutParams.MATCH_PARENT, 
                    (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics())));
        }
    
        recentConnections.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
    }
    

    如您所见,我为每个列表项设置了 onClick 侦听器,而不是 onItemClickListener。如果您想实现单击列表项的外观和感觉(通过更改 MotionEvent.ACTION_DOWN 和 MotionEvent.ACTION_UP 上的视图背景),可以轻松地将其更改为 onTouch 侦听器。

    您需要注意的另一件事是我为每个值的高度硬编码了一个 dp 值(在这种情况下为50dp)。当您以编程方式创建和膨胀视图时,它们没有“高度”值,因此“wrap_content”变为 0。

    另外,适配器上的notifyDataSetChanged() 不会做任何事情。

    正如我所说,这是一个简单的解决方案,但如果这是您最终的目标,那么它就是构建您自己的 ExtendingListView 自定义组件的开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-23
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 2013-01-18
      相关资源
      最近更新 更多