ข้ามไปที่เนื้อหาหลัก

การใช้ CheckBox ใน listView ด้วย CustomAdapter ของ Android

เมื่อคราวที่แล้ว พูดถึงเรื่องการสร้าง checkbox ใน listView ด้วย customAdapter ของ Android แต่ยังไม่ได้พูดถึงการใช้งาน checkbox ที่สร้างขึ้น

Android สร้าง ListView เพื่อการประหยัดทรัพยากร โดยจะไม่ทำการแปลง xml ไฟล์ ให้เป็น java object ในทุกครั้งที่มีการ scroll หน้าจอของ listview โดยการใช้ inflater เพราะเป็นกระบวนการที่ต้องนำเอา view ที่มีทั้งหมดใน xml มาเปลี่ยนให้เป็น object เช่น ถ้า list มีทั้งหมด 30 รายการ แต่ละรายการประกอบด้วย textView imageView และ checkBox ก็ต้องทำการแปลงให้เป็น java object ทั้งหมด ซึ่งอาจจะไม่จำเป็น เพราะรายการที่อยู่นอกหน้าจออาจจะไม่ได้ถูกใช้งานก็ได้

วิธีการประหยัดของ android คือการนำเอา list item ที่ถูก scroll ออกไปนอกหน้าจอ กลับมาใช้ใหม่ ซึ่ง Android เรียกว่า เป็นการ Recycle โดยกระบวนการทั้งหมด จะถูกกระทำใน getView()

วิธีการนี้ ทำให้เราต้องจัดการกับ checkbox ที่มีอยู่ใน listview เนื่องจากมีการนำกลับมาใช้ใหม่ ทำให้ตำแหน่งของ checkbox ที่ถูกเลือก เปลี่ยนตำแหน่งไปเป็นแบบสุ่ม เป็นผลให้ เมื่อคลิกที่ checkBox และทำการ scroll จะพบว่า มีการเลือก checkBox ตัวอื่นด้วย ทั้ง ๆ ที่ไม่ได้เลือก บางครั้ง checkBox เดิมที่เคยเลือกไว้ ก็ลบหายไปเฉย ๆ เป็นต้น

วิธีการแก้ไข คือ เราต้องจัดทำตัวแปรเก็บตำแหน่งของ checkbox เอาไว้ และใน getView() ต้องจัดการตรวจดูการคลิกของ checkbox ว่ามีหรือไม่ ถ้ามี ก็ปรับค่าตัวแปรดังกล่าว จากนั้น จึง จัดการกำหนดค่าของ checkbox ณ ตำแหน่งนั้น ตามค่าตัวแปร ก่อนส่งคืน view ต่อไป

หน้าที่ของ getView() คือการ Recycle รายการที่อยู่บนหน้าจอของ listView ต้้งแต่การสร้าง listView ครั้งแรก และเมื่อมีการ scroll ก็จะทำการ Recycle รายการที่ออกไปนอกหน้าจอ นำกลับเข้ามาใช้ใหม่ ทั้งนี้ มีการสร้าง viewHolder สำหรับเก็บข้อมูลเพื่อนำมา Recycle ด้วย

ในตัวอย่างนี้ จะเขียนโค้ดต่อจากครั้งที่แล้ว หน้าตาที่จะออกมามีดังนี้

วิธีการ

  1. ที่ customAdapter class กำหนดตัวแปร เพื่อใช้งาน ใน method ต่าง ๆ ของ class โดยกำหนด 2 ตัวแปร คือ Array สำหรับ รับค่าข้อมูลชื่อข้อสอบ และ ตัวแปร ArrayList สำหรับเก็บตำแหน่งของ checkbox โดยตัวแปร ArrayList จะมีจำนวนเท่ากับ ตัวแปร Array ที่เก็บชื่อข้อสอบ

    class CustomAdapter extends ArrayAdapter {
         String[] mainMenuItems;
         ArrayList positionArray;
  2. กำหนดรูปแบบ ตามแม่แบบ simplerow.xml และรับค่าตัวแปรที่ส่งเข้ามา พร้อมทั้งกำหนดค่าของ ตัวแปร positionArray ให้มีจำนวนสมาชิกเท่ากับ array ชื่อข้อสอบที่ส่งเข้ามา และกำหนดให้มีค่าเป็น false ทุกตัว

    public CustomAdapter(final Context context, String[] mainMenuItems) {
            super(context, R.layout.simplerow, mainMenuItems);
            this.mainMenuItems=mainMenuItems;
            positionArray = new ArrayList(mainMenuItems.length);
            for(int i =0;i            positionArray.add(false);
            }
        }
  3. ที่ getView() มีการตรวจสอบว่า convertView มีค่าเป็น null หรือไม่ ถ้าเข้ามาครั้งแรก convertView จะมีค่าเป็น null ดังนั้น จึงต้องทำการ inflate ไฟล์ simplerow ที่มี view ที่จะใช้เป็นข้อมูลในแต่ละรายการของ listView พร้อมทั้งจัดเก็บ ด้วย setTag() เพื่อว่า เมื่อเข้ามาใหม่ จะได้เรียกใช้ข้อมูลได้

    @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View view = convertView;
            ViewHolder viewHolder; // สำหรับเก็บข้อมูล item ของ list view
            if(convertView == null){ // ถ้าเข้ามาคร้งแรก convertView ไม่มีอะไร ต้อง inflate
                LayoutInflater inflater = LayoutInflater.from(getContext());
                view = inflater.inflate(R.layout.simplerow, parent, false);
                viewHolder = new ViewHolder();
                viewHolder.examName = (TextView)view.findViewById(R.id.examName);
                viewHolder.checkbox = (CheckBox)view.findViewById(R.id.chkBox);
                // เก็บข้อมูลไว้ใน View
           view.setTag(viewHolder);
            }
            else{
                //นำข้อมูลเก่าที่มีอยู่แล้วมาใช้ ไม่ต้อง inflate ใหม่
                viewHolder = (ViewHolder) view.getTag();
            }
  4. นำชื่อข้อสอบที่ส่งเข้ามา เป็นชื่อข้อสอบของ list item นี้ โดยระบุตำแหน่งของ array ที่เป็นปัจจุบัน ตัวแปร position เป็นตัวแปรของระบบ ที่ android เก็บค่าจริงลำดับรายการใน listView พร้มทั้งรับค่าการคลิกจากปุ่ม checkBox ถ้ามีการคลิก ก็จัดการปรับค่าตัวแปรตำแหน่งที่จะใช้กำหนดค่าของ checkbox ให้ถูกต้อง

            viewHolder.examName.setText(mainMenuItems[position]);
            // รับการคลิกของ checkbox แล้วปรับค่าตัวแปรสำหรับนำไปใช้กับ checkbox ถ้า true แสดงว่าตำแหน่งนี้ ถูกคลิกอยู่
            viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (isChecked) { // ตำแหน่งนี้ถูกคลิกที่หน้าจอ
                        positionArray.set(position, true);  // ปรับค่าตำแหน่งนี้ (ที่จะใช้อ้างถึง checkbox ให้เป็น true
                    } else {
                        positionArray.set(position, false);
                    }
                }
            });


  5. ก่อนคืนค่า view ออกไป ให้ปรับค่า checkBox ตามค่าในตัวแปร positionArray

     viewHolder.checkbox.setChecked(positionArray.get(position)); // ปรับค่า checkbox
            return view;
        }
  6. สำหรับ ViewHolder ที่จะเก็บข้อมูล รายการ list ที่ถูกเลื่อนออกนอกจอ จะเก็บ 2 ตัว คือ ชื่อข้อสอบ และ checkBox

    static class ViewHolder {
            protected TextView examName;
            protected CheckBox checkbox;
        }
  7. เป็นอันเสร็จ เมื่อมีการเลือก checkBox และมีการ Scroll ข้อมูลการเลือกจะอยูเป็นปกติ
ดาวน์โหลดไฟล์ คลิกที่นี่


ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

อุปมา อุปไมย สำนวนการเปรียบเทียบ ของไทย

การเตรียมสอบ ก.พ. ภาค ก. เพื่อสอบบรรจุเข้ารับราชการ มีการทดสอบความสามารถทั่วไป มักจะมี
ข้อสอบที่เกี่ยวกับอุปมาอุปไมย  ข้อสอบมีลักษณะ ให้หาตัวเลือกที่มีความหมาย ความสัมพันธ์คล้ายคลึง หรือเหมือนกับที่โจทย์กำหนดให้มา  หรือเติมข้อความที่มีความหมายสอดคล้องกับคำอุปมาอุปไมยที่ยกมาให้ เป็นต้น ดังนั้น การเข้าใจความหมายของคำอุปมาอุปไมย จึงช่วยให้ทำข้อสอบได้ดียิ่งขึ้น

คำอุปมาอุปไมย หมายถึง ถ้อยคำที่เป็นสำนวนพวกหนึ่ง กล่าวทำนองเปรียบเทียบ ให้เห็นจริง เข้าใจแจ่มแจ้งชัดเจน และสละสลวยน่าฟังมากขึ้น การพูดหรือการเขียน นิยมหาคำอุปมาอุปไมยมาเติมให้ได้ความชัดเจนเกิดภาพพจน์ เข้าใจง่าย เช่น

คนดุ หากต้องการให้ความหมายชัดเจน น่าฟัง และเกิดภาพพจน์ชัดเจนก็ต้องอุปมาอุปไมยว่า “ดุ เหมือน เสือ”
ขรุขระมาก การสื่อความยังไม่ชัดเจนไม่เห็นภาพ ต้องอุปมาอุปไมยว่า “ขรุขระเหมือนผิวมะกรูด” หรือ “ขรุขระเหมือนผิวพระจันทร์” ก็จะทำให้เข้าใจ ความหมายในรูปธรรมชัดเจนมากยิ่งขึ้น

คำอุปมาอุปไมยที่ควรรู้จัก (พิมพ์คำ/ข้อความ แล้วกดปุ่ม "ค้นหา")

แนวข้อสอบ เงื่อนไขสัญลักษณ์

ครั้งที่แล้ว ได้แนะนำหลักการทำ ข้อสอบ ก.พ. ภาค ก. ความสามารถทั่วไป เงื่อนไขสัญลักษณ์ มา แล้ว ถ้าใครยังไม่ได้อ่าน ก็คลิกกลับไปอ่านได้
ความจริง ข้อสอบเงื่อนไขสัญลักษณ์ เป็นข้อสอบไม่ยาก ถ้าเข้าใจหลักการ และมีทักษะความชำนาญ ใจเย็น ๆ อย่าตื่นเต้น โดยเฉพาะการดูเครื่องหมายต่าง ๆ อย่าดูผิด เช่น เครื่องหมายมากกว่า (>) น้อยกว่า (<) เป็นต้น เพราะการแก้ปัญหาโจทย์เงื่อนไขสัญลักษณ์ หรือ inequality ก็คล้ายกับการแก้ปัญหาสมการโดยทั่วไป นั่นเอง คือ สามารถบวก ลบ คูณ หาร ด้วยจำนวนที่เท่ากัน ทั้งสองข้างของเครื่องหมายได้ กลับเศษเป็นส่วนได้ แต่ก็มีบางเรื่อง บางรายละเอียดที่แตกต่างกันบ้าง ซึ่งอ่านได้จาก ข้อสอบ ก.พ. ภาค ก. ความสามารถทั่วไป เงื่อนไขสัญลักษณ์ นะครับ ครั้งนี้ จึงเป็นการนำแนวข้อสอบ เงื่อนไขสัญลักษณ์ เพื่อนำมาฝึกทำให้เกิดทักษะความชำนาญ เพื่อจะได้ทำข้อสอบได้รวดเร็วขึ้น เพราะในห้องสอบ เวลาจัดได้ว่ามีค่ามาก ยิ่งทำเร็วและถูกต้อง ยิ่งดี คำสั่ง

เลือกตอบข้อ 1. ถ้าข้อสรุปทั้งสอง ถูกด้องหรือเป็นจริง ตามเงื่อนไข
เลือกตอบข้อ 2. ถ้าข้อสรุปทั้งลอง ผิดหรือไม่เป็นจริง ตามเงื่อนไข
เลือกตอบข้อ 3. ถ้าข้อ…

เทคนิคการทำ ข้อสอบ อนุกรม ของ ก.พ.

|ประเภทของอนุกรม เทคนิคการทำโจทย์เลข อนุกรม ข้อแนะนำเพิ่มเติม |


ข้อสอบเลขอนุกรม ของ ก.พ. ต้องการวัดความถนัดทางด้านตัวเลข โดยการจัดทำตัวเลขเป็นชุด ๆ ที่มีความสัมพันธ์กันบางอย่าง โดยให้ผู้เข้าสอบได้แสดงความถนัดด้านตัวเลข ในการวิเคราะห์และแก้ปัญหาตามที่โจทย์ระบุ


ประเภทของอนุกรม รูปแบบความสัมพันธ์ของตัวเลขอนุกรมเท่าที่พบบ่อย ๆ มีหลายประเภท เช่น

ก. อนุกรมเชิงเดี่ยว 

ได้แก่ชุดตัวเลขที่เป็นอนุกรมเพียงชุดเดียว เช่น
ค่าของตัวเลขเพิ่มขึ้นต่อเนื่องอย่างเป็นระบบ โดยการบวก หรือ คูณ ตัวเลขก่อนหน้า เช่น บวกด้วยตัวเลขที่เป็นค่าคงที่ เช่น    5   10   15   20   ...?...
บวกด้วยตัวเลขที่มีระบบ เช่น     1    2    5    10   ...?...
คูณด้วยค่าคงที่ เช่น   1   3   9   27   ...?...
มีทั้ง บวก ลบ คูณ หรือหาร สลับกัน เช่น บวกแล้วคูณด้วยค่าคงที่สลับกัน ดังตัวอย่าง  5   7    14   16  32   ...... มีการ บวก ลบ คูณ หรือ หาร ร่วมกัน เช่น  15   31   63   127   255  ...?...
ในตัวอย่างนี้ จะเห็นว่า ตัวเลขตัวแรกคูณด้วย 2 และบวกด้วย 1 จะได้ตัวเลขตัวถัดไป คูณด้วยค่าคงที่ที่เป็นเศษส่วน ให้สังเกตความสัมพันธ์ว่า ตัวเลขก่อนหน้า …