個人覺得 GridView 中實現單元格合併的需求並不常見,但是這裏還是介紹一種方法,先看一下效果圖:
接下來是代碼實現:
public class MainActivity extends Activity {
private static GridView mGridView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGridView = new GridView(getApplicationContext());
MAdapter adapter = new MAdapter(mGridView.getContext(), new String[]{"item1", "item2", "item3",
"item4", "item5", "item6", "item7", "item8", "item9", "item10", "item11", "item12",
"item13", "item14", "item15", "item16", "item17", "item18", "item19", "item20"});
mGridView.setAdapter(adapter);
mGridView.setNumColumns(2);
setContentView(mGridView);
}
class MAdapter extends BaseAdapter {
private String[] items;
private Context context;
public MAdapter(Context context, String[] items) {
this.items = items;
this.context = context;
}
@Override
public int getCount() {
return items.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView;
if (position % 4 == 0) {
textView = new MyText(context);
AbsListView.LayoutParams params = new AbsListView.LayoutParams(
AbsListView.LayoutParams.MATCH_PARENT, 100);
textView.setLayoutParams(params);
textView.setTextColor(Color.BLACK);
textView.setTextSize(20);
textView.setText(items[position]);
textView.setBackgroundColor(Color.GRAY);
textView.setGravity(Gravity.CENTER);
} else {
textView = new TextView(context);
AbsListView.LayoutParams params = new AbsListView.LayoutParams(
AbsListView.LayoutParams.MATCH_PARENT, 200);
textView.setLayoutParams(params);
textView.setTextColor(Color.BLACK);
textView.setTextSize(20);
textView.setText(items[position]);
textView.setVisibility(View.VISIBLE);
if (position % 4 == 1) {
AbsListView.LayoutParams params2 = new AbsListView.LayoutParams(
AbsListView.LayoutParams.MATCH_PARENT, 100);
textView.setLayoutParams(params2);
textView.setVisibility(View.INVISIBLE);
}
textView.setGravity(Gravity.CENTER);
}
return textView;
}
class MyText extends TextView {
public MyText(Context context) {
super(context);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int targetWidth = mGridView.getMeasuredWidth()
- mGridView.getPaddingLeft()
- mGridView.getPaddingRight();
widthMeasureSpec = MeasureSpec.makeMeasureSpec(targetWidth,
MeasureSpec.getMode(widthMeasureSpec));
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
}
}
了 BaseAdapter ,並且在重寫 getView 方法時動態設置了 GridView 的寬度和高度。
解決方案:
首先檢查 getView 方法中是否有動態設置 LayoutParams 的操作,如果有,那麼 注意不能 new 一個新的LayoutParams ,而是
應該調用 getLayoutParams 獲取已有的 LayoutParams 。如果 getLayoutParams 返回爲空或者返回的 LayoutParams 不是
AbsListView.LayoutParams ,那麼在 getView 之前使用 setLayoutParams 方法設置一下。
如果還有問題,那麼檢查是否採用了 ViewHolder 的寫法,如果是則改成每次 getView 時都重新創建新的 View。
博主也遇到過這種問題,但是在使用了上面的方法排查後解決了問題,希望也可以解決你遇到的問題。