2013-10-01 5 views
4

я есть ExpandableListview внутри ScrollView и я знаю, что это не хорошо, но я был слишком, единственное решение, чтобы показать весь список является установить его высоту с помощью кода, используя layoutParamsандроид высота набор ListView динамически

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams (LayoutParams.MATCH_PARENT, ListViewData.length());

это решение хорошо, но я не могу понять правильную высоту, что я должен дать в Params, так есть ли способ узнать фактический размер от размера массива

Edit: я придумал решение, которое каждый раз, когда я открываю группу списка утра собирается изменить высоту, чтобы соответствовать новым geight

+0

эй, напишите свое решение? – yshrsmz

ответ

0

вы можете установить переменную в размерах файла для различных размеров экрана, а затем умножить его на число элементов списка, которые вы хотите отобразить.

+0

Я попытался использовать фиксированную переменную, а затем умножить ее на количество элементов, но не работает в разных размерах экрана – alaa7731

+0

@ alaa7731, вот что я сказал, вам нужно установить разные значения для разных размеров экрана. – Pallavi

13

попробуйте это, используйте Child на основе listview. setListViewHeightBasedOnChildren() это установит ваш ребенок на основе ListView высота

public class Utils { 

public static void setListViewHeightBasedOnChildren(ListView listView) { 
    ListAdapter listAdapter = listView.getAdapter(); 
    if (listAdapter == null) { 
     // pre-condition 
     return; 
    } 

    int totalHeight = 0; 
    for (int i = 0; i < listAdapter.getCount(); i++) { 
     View listItem = listAdapter.getView(i, null, listView); 
     listItem.measure(0, 0); 
     totalHeight += listItem.getMeasuredHeight(); 
    } 

    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 
} 



} 
+0

mmmmmmmm хорошо я попробую сейчас – alaa7731

+4

не работает, высота больше, чем должна быть – alaa7731

+1

Это работает, но вы должны добавить источник этого решения. – Kailas

8

Ваш ListView эффективно ненужный в данном случае. Вы можете также перебрать элементы вашего адаптера и просто добавить их в вертикальный LinearLayout внутри вашего ScrollView.

В случае, если вы не хотите, чтобы изменить много кода:

Заменить ListView.setAdapter с

LinearLayout ll; //this should be the vertical LinearLayout that you substituted the listview with 
for(int i=0;i<adapter.getCount();i++) { 
    View v = adapter.getView(position, null, null); 
    ll.addView(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
} 

Если вы уже используете OnItemClickListener добавить после View v = adapter.getView(position, null, null); следующие

final int position = i; 
v.setOnClickListener(new OnClickListener() { 
    public onClick(View v) { 
     yourOnItemClickListener.onItemClick(null, v, position, 0); 
    } 
}); 

В этом случае вам не придется беспокоиться t любой просчет в высоте.

+0

Я придумал это решение в случае listView, но теперь он изменится на ExpandableListView: /, поэтому в этом случае тоже нужно сделать динамически – alaa7731

+0

Думаю, вы должны создать новый вопрос для этого редактирования. Вы специально попросили список. –

+0

Да, я думаю: /, спасибо в любом случае – alaa7731

3

Попробуйте, это работает для моих же проблем

public static boolean setListViewHeightBasedOnItems(ListView listView) { 

ListAdapter listAdapter = listView.getAdapter(); 
if (listAdapter != null) { 

    int numberOfItems = listAdapter.getCount(); 

    // Get total height of all items. 
    int totalItemsHeight = 0; 
    for (int itemPos = 0; itemPos < numberOfItems; itemPos++) { 
     View item = listAdapter.getView(itemPos, null, listView); 
     item.measure(0, 0); 
     totalItemsHeight += item.getMeasuredHeight(); 
    } 

    // Get total height of all item dividers. 
    int totalDividersHeight = listView.getDividerHeight() * 
      (numberOfItems - 1); 

    // Set list height. 
    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = totalItemsHeight + totalDividersHeight; 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 

    return true; 

} else { 
    return false; 
}} 

requestLayout() метода вызываются на представление, потому что что-то изменилось, что недействительное его расположение - силы перерисовки.

+0

** NPE ** выбрасывается в 'item.measure (0, 0);'. – SilentKnight

Смежные вопросы