4

データを変更した後にリストビューの高さを取得しようとしていますが、実際の高さではなく、常に以前の高さを返します。

そのため、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);
4

2 に答える 2

13

わかりました、私は解決策を見つけました。

ListView で SetAdapter を変更すると、1 行を意味するメジャーの高さを取得し、行番号と仕切りの高さを行番号で掛けます。

これが私が行った例です。より良い方法かどうかはわかりませんが、完全に機能します^^:

    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;
    }
于 2012-09-14T11:28:54.397 に答える
1

OnHierarchyChangeListener子アイテムがリストに追加またはリストから削除されたときにリストビューの新しい高さの値を取得できるように、リストビューに を追加する必要があります。

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' に設定すると、リスト ビューは最初から親ビュー内の最大許容高さを占有するため、項目を削除または追加しても高さは変化しません。 .

于 2012-09-13T18:20:18.623 に答える