2015-10-20 7 views
0

У меня есть GridView с ячейками переменной высоты. Я хочу, чтобы строка была выше, чем вся самая большая ячейка в строке. Я могу настроить высоту ячеек, чтобы быть последовательной в строке, но я не могу установить высоту GridView и изменить ее.Android Set GridView Height

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

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

GridView auto height calc wrong

Я попробовал множество способов, чтобы обновить его, но я уверен, что я что-то просто не хватает. Я пытаюсь сделать обновление в ViewTreeObserver, поэтому я знаю, что GridView сделал так, что мои вычисления корректны (и они есть). Код:

 ViewTreeObserver treeListener = mGridView.getViewTreeObserver(); 
     treeListener.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      @SuppressLint("NewApi") 
      @SuppressWarnings("deprecation") 
      @Override 
      public void onGlobalLayout() { 
       if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { 
        mGridView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       } 
       else { 
        mGridView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
       } 

       // Calculate the new height we want for the GridView 
       int newHeight = determineCellHeight(mGridView, mNumberOfColumns, mRows); 

       ViewGroup.LayoutParams params = mGridView.getLayoutParams(); 
       params.height = newHeight; 
       mGridView.setLayoutParams(params); 

       // Have tried all of these too!!! 
//    mAdapter.notifyDataSetChanged(); 
//    mGridView.requestLayout(); 
//    mGridView.invalidateViews(); 
//    mGridView.refreshDrawableState(); 

//    mGridView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, newHeight + 10)); 
//    mGridView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, newHeight + 10)); 
//     View lastChild = mGridView.getChildAt(mGridView.getChildCount() - 1); 
//     mGridView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, lastChild.getBottom())); 
//     mAdapter.notifyDataSetChanged(); 
//     mGridView.invalidateViews(); 
//     mGridView.setMinimumHeight(newHeight); 
//     mGridView.requestLayout(); 
//     mGridView.refreshDrawableState(); 

      } 
     }); 

Я начинаю задаваться вопросом, если это еще возможно, хотя многочисленные Stackflows кажется, предполагают, что это ...

ответ

0

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

public class ExpandableHeightGridView extends GridView { 

    boolean expanded = false; 

    public ExpandableHeightGridView(Context context) { 
     super(context); 
    } 

    public ExpandableHeightGridView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public ExpandableHeightGridView(Context context, AttributeSet attrs, 
      int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public boolean isExpanded() { 
     return expanded; 
    } 

    public void setExpanded(boolean expanded) { 
     this.expanded = expanded; 
    } 

    @Override 
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     if (isExpanded()) { 
      int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, 
        MeasureSpec.AT_MOST); 
      super.onMeasure(widthMeasureSpec, expandSpec); 
      ViewGroup.LayoutParams params = getLayoutParams(); 
      params.height = getMeasuredHeight(); 
     } else { 
      super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     } 
    } 

} 

Надеюсь, это поможет.