gridView自己定义做时间排版

公司有需求要做一个时间排版,原型例如以下



由于要用的gridView,曾经就是它的排版非常多,最看是想用一个checkbox搞定。

后来证实功能可以达到。可是排版是乱的。还是老老实实多写点吧(直接上代码)

技术不好什么地方不正确求指正


首先是主页:

public class MyActivity extends Activity {
    /**
     * Called when the activity is first created.
     */
    private HashSet<Integer> shou = new HashSet<Integer>();
    private int[] Mark = {1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0};
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button button = (Button) findViewById(R.id.button);
        final WrapGridView wrapGridView = (WrapGridView) findViewById(R.id.gridview);
        final DayTimeAdapter dayTimeAdapter = new DayTimeAdapter(this, Mark);
        wrapGridView.setAdapter(dayTimeAdapter);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MyActivity.this, "fdsgs", Toast.LENGTH_SHORT).show();
                shou = dayTimeAdapter.remark();
                Iterator<Integer> iterator = shou.iterator();
                while (iterator.hasNext()) {
                    Log.i("mark", iterator.next() + "");
                }
            }
        });
    }
}

主要是 用来传入表示数组  和接受返回选中标识的

自己定义gridView:

public class WrapGridView extends GridView{
    public WrapGridView(Context context) {
        super(context);
    }

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

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction()==MotionEvent.ACTION_MOVE){
            return true;//禁止滑动
        }
        return super.dispatchTouchEvent(ev);
    }
}
这里是来来禁止滑动    只是onMeasure方法 只是你后面要在代码里自己设置高宽的时候须要

最后是适配器:

public class DayTimeAdapter extends BaseAdapter{
    private ArrayList<Integer> Mark = new ArrayList<Integer>();
    private String[] Time = {"8:00", "8:30", "9:00", "9:30", "10:00", "10:30", "11:00", "11:30", "12:00", "12:30", "13:00", "13:30", "14:00", "14:30",
            "15:00", "15:30", "16:00", "16:30", "17:00", "17:30", "18:00", "18:30", "19:00", "19:30", "20:00"};
    private LayoutInflater mInflater;
    private HashSet<Integer> returnMark = new HashSet<Integer>();

    public DayTimeAdapter(Context context, int[] m) {
        mInflater = LayoutInflater.from(context);
        for (int i = 0; i < m.length; i++) {
            Mark.add(m[i]);
        }
    }

    @Override
    public int getCount() {
        return Mark.size();
    }

    @Override
    public Object getItem(int i) {
        return Mark.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(final int i, View view, ViewGroup viewGroup) {
        DayTimeHolder dayTimeHolder=null;
        if (view == null||view.getTag()==null) {
            view = mInflater.inflate(R.layout.item_time, null);
            dayTimeHolder=new DayTimeHolder();
            dayTimeHolder.checkBox = (CheckBox) view.findViewById(R.id.checkBox);
            dayTimeHolder.timeName= (TextView) view.findViewById(R.id.textView);
            view.setTag(dayTimeHolder);
        }else {
            dayTimeHolder = (DayTimeHolder) view.getTag();
        }
        dayTimeHolder.timeName.setText(Time[i]);
        int a = Mark.get(i);
        if (a == 0) {
            view.setBackgroundColor(Color.parseColor("#04385A"));
            dayTimeHolder.checkBox.setVisibility(View.INVISIBLE);
            dayTimeHolder.checkBox.setClickable(false);
        }
        final View finalView = view;
        final Handler handler = new Handler() {
            public void handleMessage(Message msg) {
                if (msg.what == 1) {
                    finalView.setBackgroundColor(Color.parseColor("#F0AB4E"));
//                    Log.i("mark","shoushoushou");
                } else {
                    finalView.setBackgroundColor(Color.parseColor("#000000"));
                }
            }
        };
        dayTimeHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                Message msg = new Message();
                if (b) {
                    msg.what = 1;
                    Log.i("mark", "111111111111");
                    returnMark.add(i);
                } else {
                    msg.what = 2;
                    Log.i("mark", "22222222222222");
                    returnMark.remove(i);
                }
                handler.sendMessage(msg);
            }
        });

        return view;
    }

    public HashSet remark() {
        return returnMark;
    }
}
class DayTimeHolder{
    public CheckBox checkBox;//多选button
    public TextView timeName;//时间名称
}


这里就是 直接初始化gridview结构。

里面用到的handler和message是动态更新选中状态的须要啦。

好久没写过这些了,我们这行除了技术就是经验了积累。

唉。怎么越学感觉自己越懒。。





posted @ 2016-01-17 20:38  yxwkaifa  阅读(308)  评论(0编辑  收藏  举报