设置适配器后获取ListView的高度

4

嗯,我正在尝试在更改数据后获取我的listview高度,但它总是返回先前的高度而不是实际高度。

所以当我设置setadapter时,它会获取旧值。 例如:

 ActualHeight = 100
 Change data (filter) -> NewHeight = 60
 ListView.GetHeight still returns 100.

 Again

 ActualHeight = 60
 Change data (filter) -> NewHeight = 20
 ListView.GetHeight still returns 60.

我使用的代码如下:

这个代码是这样的:

                    int width, height = 0;

                    EditText edt_search;
                    ListView lv_marca;

                    List<Marca>  list_marca        = new ArrayList<Marca>();
                    List<Marca>  list_marca_search = new ArrayList<Marca>();

                    String text = edt_search.getText().toString(); 


                    list_marca_search.clear();

                    if(text.startsWith(".")){
                        text = text.replace(".", "");
                        for (Marca m : list_marca) {
                            if (String.valueOf(m.getCd_marca()).equals(text)){
                                list_marca_search.add(m);
                            }
                        }
                    } else {
                        for (Marca m : lista_marca) {
                            if (m.getDs_marca().contains(text)){
                                list_marca_search.add(m);
                            }
                        }
                    }

                    ArrayAdapter<Marca> adapter_marca = new CustomAdapter_Marca(MyDialog.this, R.layout.layout_consulta_estoque_marca_lista, list_marca_search);

                    lv_marca.setAdapter(adapter_marca);

                    int height_window  = getWindowManager().getDefaultDisplay().getHeight();
                    height             = lv_marca.getHeight() + getSupportActionBar().getHeight();

                    if (height >= height_window) {
                        height = (int) (height_window * 0.95);
                    }

                    getWindow().setLayout(width, height);
2个回答

13

好的,我找到了解决方案。

当我在我的ListView中更改SetAdapter时,我会获得测量高度,这意味着一行,并通过行数加上分隔线高度乘以行数。

以下是我所做的示例,我不知道是否是更好的方法,但它完美地工作 ^^:

    ListView lv_marca; 

    lv_marca.setAdapter(adapter_marca);

    int list_height = getListViewHeight(lv_marca);



    private int getListViewHeight(ListView list) {
          ListAdapter adapter = list.getAdapter();

          int listviewHeight = 0;

          list.measure(MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED), 
                       MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

          listviewHeight = list.getMeasuredHeight() * adapter.getCount() + (adapter.getCount() * list.getDividerHeight());

          return listviewHeight;
    }

你的代码无法运行,请不要将不合适的答案标记为解决方案。建议删除。 - user1324936
@user1324936 在建议删除之前,您应该更加努力尝试:它的效果非常好。 - AlexS
@Cechinel,你的代码在2.3版本中可以正常工作,但在4.2和4.1版本中高度不同。请给我一个解决方案。 - Rohan Pawar
应该计算ListItem高度总和,而不是ListView高度n次。请参见http://stackoverflow.com/a/11967081/8524以获取更好的解决方案。 - Diederik
这是不恰当的答案。它会给出比内容实际高度更高的高度。 - Harshil

1
你需要在你的listview中添加一个OnHierarchyChangeListener,这样当子项被添加或从列表中删除时,你就可以获取listview的新高度值:
lv_marca.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() 
{
    @Override
    public void onChildViewRemoved(View parent, View child) 
    {
        // This will give you the height when your new adapter contains 
        // lesser number of items than the previous one
        int heightAfterItemRemoved=parent.getHeight();
        Log.i("list_view_height_change","Height after removing item : "+heightAfterItemRemoved);
    }

    @Override
    public void onChildViewAdded(View parent, View child) 
    {
        // This will give you the height when your new adapter contains 
        // greater number of items than the previous one
        int heightAfterItemAdded=parent.getHeight();
        Log.i("list_view_height_change","Height after adding item : "+heightAfterItemAdded);                
    }
});

有一个注意点 - 这只适用于您的列表视图的 'layout_height' 属性设置为 'wrap_content'。在这种情况下,随着项目的添加或删除,列表视图的高度会相应地增加或减少。当列表视图完全填充时,列表视图的高度达到最大值。如果您向列表视图添加更多项目,则它将溢出并可滚动,但高度值不会改变,因为它已经占据其父视图中允许的最大高度。

如果您将 'layout_height' 设置为 'fill_parent' 或 'match_parent',则列表视图将从一开始就占据其父视图中允许的最大高度,因此,将其删除或添加项目将不会导致其高度发生任何变化。


谢谢,但它触发了很多次,我不想要它。我已经找到了解决方案。 - Cechinel
1
@Cechinel:很好,你找到了解决方案。请将其发布,以便对于其他遇到类似问题的人有所帮助。 - sandyiscool
1
好的@sandyiscoll,我一直在等待回答自己的帖子的时间^^ - Cechinel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接