Android GridView之實現單元格合併,以及第一個item點擊無響應或顯示不正常的解決方案

個人覺得 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);
            }

        }

    }

}


接下來再說一個不太常見的問題,在使用 GridView 時第一個 item 點擊無響應或顯示不正常,這種情況一般都是因爲使用

了 BaseAdapter ,並且在重寫 getView 方法時動態設置了 GridView 的寬度和高度。

解決方案:

        首先檢查 getView 方法中是否有動態設置 LayoutParams 的操作,如果有,那麼 注意不能 new  一個新的LayoutParams ,而是

應該調用 getLayoutParams 獲取已有的 LayoutParams 。如果 getLayoutParams 返回爲空或者返回的 LayoutParams 不是 

AbsListView.LayoutParams ,那麼在 getView 之前使用 setLayoutParams 方法設置一下。

        如果還有問題,那麼檢查是否採用了 ViewHolder 的寫法,如果是則改成每次 getView 時都重新創建新的 View。

博主也遇到過這種問題,但是在使用了上面的方法排查後解決了問題,希望也可以解決你遇到的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章