我正在尝试更改gridView列号。我致电setNumColumn()
和invalidateViews()
来更新视图。
但是,网格的单元格宽度不会动态变化。我设置了stretchMode="columnWidth"
,但它没有用。
答案 0 :(得分:3)
解决问题:
当网格视图在运行时更改列时,网格视图中的子视图不会重新计算其布局。
在BaseAdapter中,您应该调用forceLayout()来计算其布局。
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
if (null == convertView) {
convertView = mInflater.inflate(
R.layout.mnm_customer_user_thumbnail, null);
control.txtUserName = (TextView) convertView
.findViewById(R.id.mnmTxtStudentName);
control.image = (ImageView) convertView
.findViewById(R.id.mnmImageStudent);
control.imageCheckBox = (ImageView) convertView
.findViewById(R.id.mnmImageCheckBox);
control.mnmOuterBounder = (RelativeLayout) convertView
.findViewById(R.id.mnmOuterBound);
convertView.setTag(control);
} else {
convertView.forceLayout();
}
...
...
...
...
由于
答案 1 :(得分:2)
可能您可以通过Google提供的这个漂亮的示例获得帮助 http://developer.android.com/shareables/training/BitmapFun.zip 以下代码位于ImageGridFragment.java中,用于在运行时动态处理列号更改,例如旋转设备时屏幕方向更改:
以下是注释:此侦听器用于获取GridView的最终宽度,然后计算列数和每列的宽度。每列的宽度都是可变的,因为GridView具有stretchMode = columnWidth。列宽用于设置每个视图的高度,因此我们获得了nic square缩略图。
mGridView.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (mAdapter.getNumColumns() == 0) {
final int numColumns = (int) Math.floor(
mGridView.getWidth() / (mImageThumbSize + mImageThumbSpacing));
if (numColumns > 0) {
final int columnWidth =
(mGridView.getWidth() / numColumns) - mImageThumbSpacing;
mAdapter.setNumColumns(numColumns);
mAdapter.setItemHeight(columnWidth);
if (BuildConfig.DEBUG) {
Log.d(TAG, "onCreateView - numColumns set to " + numColumns);
}
}
}
}
});
return v;
答案 2 :(得分:0)
在xml中你必须提供这个属性..
android:stretchMode="columnWidth" . In your adapter depending on the size(by `getCount()`) of the list colomn will create dynamically..