ListView ใน Android : ตอนที่ 1 – รู้จัก Adapter

Share Button

สวัสดีครับ วันนี้มีอารมณ์อยากเขียน Blog ซะหน่อย ฉลอง Theme ใหม่ ความจริงอยากลองเขียนให้ได้ทุกวันมั่งนะครับ แต่ขี้เกียจแน่ๆ ฮ่าๆ

อยากเขียนบทความชุดนี้ ให้ Android Dev มือใหม่ได้อ่านกันนะครับ เพราะว่า ListView เนี่ยเป็น อะไรที่พื้นฐานมากๆ เห็นกันแทบทุก App เลย แต่ว่ามันมี ทริค เทคนิคอะไรมากมาย ในการที่จะทำให้ App ออกมาแล้ว เอานิ้วปัด ลื่นปรู๊ดปร๊าด

มาทำ Optimize กันซักนิดครับ เค้าจะได้ไม่หาว่า Android อืดกัน ฮ่าๆ

ในตอนที่ 1 นี้ ขออธิบายสั้นๆ ก่อนแล้วกันว่า หลักการมันเป็นยังไง แล้วส่วนว่าจะ Optimize ยังไง เอาไว้ต่อตอนหน้ากันนะครับ

องค์ประกอบหลักของ ListView เนี่ย มันประกอบ ด้วย 2 ส่วน คือ

  1. ListView – คือ อิตัว View ที่รองรับการ ปัดไปมาของ User การคลิก อะไร แค่นั้นหลักๆ
  2. ListAdapter – อินี่คือหัวใจเลย มันมีหน้าที่ สร้าง List Item (แต่ละแถวของ List อ่ะ) มีหน้าที่ จัดการข้อมูล เอามาสร้างเป็น ชิ้น UI คือ List Item แล้วส่งไปให้ ListView แสดง

การทำงานของมันเนี่ย คือ เวลาเราเอานิ้วปัด สมมติว่าปัดลง ListView มันจะเอา List Item อันล่างสุด ที่หายไปจากจอ เพราะโดนเลื่อนลง ส่งไปให้ Adapter ของมัน ซึ่งอิ View ตัวนี้ เค้าเรียกกันว่า Convert View หมายถึง View นี้ ชั้นไม่ใช้แล้วนะ เอาไป Reuse Recycle อะไรมาใช้ใหม่ได้เลย ซึ่งสิ่งที่ Adapter ควรทำคือ เอา View นี้มา อัพเดท ข้อมูลใหม่ แล้ว จับยัดกลับไปข้างบน ตามรูปประกอบ

การทำงานของ ListView เวลาเราเลื่อน

การทำงานของ ListView เวลาเราเลื่อน

ไอ้ View ตัวสีดำข้างล่าง ที่หลุดหน้าจอมา จะถูกส่งไปให้ Adapter แล้วเปลี่ยน ข้อมูล เอากลับมายัดด้านบน แบบนี้แล

ที่ระบบทำแบบนี้ ก็เพราะว่า ในกรณี ที่ข้อมูลมีเยอะมากๆ 1000 rows ไรแบบนี้ การทำ ให้มันมีการ Reuse แบบนี้ จะช่วยลด จำนวน Object ที่เกิดขึ้นในระบบไปได้ มากๆๆๆๆๆๆ เพราะส่วนมาก พวก List มันก็ มีหน้าตาเดียวกัน แค่เปลี่ยนข้อมูล นึกภาพ Pantip Fan App หน้ารวมรายชื่อกระทู้ แต่ละอันมันก็ต่างแค่ ชื่อกระทู้ เวลา จำนวนคอมเม้น ไรแบบนั้น Adapter มีหน้าที่แค่ setText() ใหม่ลงไป แล้วจับยัดข้างบน แค่นั้น

ตรงจุดนี้แหละครับ ที่มือใหม่บางคน ทำผิดพลาด และทำให้ App ออกมากระตุกมากมาย

ซึ่งที่ผิดกันมากๆ ก็คือ เขียน Adapter โดยไม่ยอมเอา ConvertView มาใช้ใหม่ ถ้าเทียบกับรูปข้างบนคือ ไม่ได้ เอาข้างล่าง กลับไปยัดข้างบนใหม่ แต่ใช้ เลยจอมาข้างล่าง ก็ทิ้งไปเลย แล้วไอ้ตัวข้างบน สร้างขึ้นมาใหม่ จาก 0 เลย ซึ่งนั่นแหละ ทำให้เกิด Object ขยะ จำนวนมากในระบบ ที่ต้องรอ Garbage Collector มาเก็บกวาดต่อไป

ซึ่งวิธีเอา Convert View มาใช้ ติดไว้มาเล่าต่อตอนหน้านะครับ

สำหรับวันนี้ สวัสดีครับ

 

เป้าหมายคนเราต่างกัน

Share Button

เป้าหมายคนเราต่างกัน
ใครตั้งเป้าสูง ก็อย่าเอาเป้าตัวเอง ไปวัดคนอื่น
ใครเป้าต่ำ ก็ไม่ต้องเอาเป้าตัวเองไปวัดคนอื่นเช่นกัน

ความพอใจในชีวิตคนไม่เท่ากัน

เป้าหมายในโลกมีสองเป้าหมาย

เป้าหมายของกู กับ เป้าหมายของมึง 5555

วิธีดูว่า Url ใดๆ ถูก Tweet หรือถูก Shared บน Facebook กี่ครั้ง

Share Button

วันนี้ผมเจอของเล่นใหม่ที่น่าจะนำไปต่อยอดได้เยอะครับ
เป็นวิธีที่จะใช้เช็คว่า Url ใดๆ ถูก Tweet หรือถูก Shared บน Facebook กี่ครั้ง

โดยตัวอย่าง เช่นต้องการรู้ว่า มีการแชร์ หรือ ทวิต url http://www.blognone.com/node/42352 กี่ครั้ง

Twitter ทำได้โดยเรียก http://urls.api.twitter.com/1/urls/count.json?url=http://www.blognone.com/node/42352

Twitter API จะคืนค่าเป็น JSON มาดังต่อไปนี้
{“count”:14,”url”:”http:\/\/www.blognone.com\/node\/42352\/”}

ส่วน Facebook ทำได้โดยเรียก
http://graph.facebook.com/?ids=http://www.blognone.com/node/42352

Facebook Graph API จะคือ JSON ออกมาดังนี้
{
http://www.blognone.com/node/42352“: {
“id”: “http://www.blognone.com/node/42352“,
“shares”: 34
}
}

จะเห็นว่า URL http://www.blognone.com/node/42352 ถูก Twit 14 ครั้ง และถูกแชร์ บน Facebook 34 ครั้ง

samsung-galaxy-s4-i9500

Samsung Galaxy S4 ดีไหม?

Share Button

หลังจากที่ Samsung ได้เปิดตัว Samsung Galaxy S4 ไปแล้วเมื่อคืนนะครับ หลายคนต้องถามกันแน่นอนว่า แล้วเจ้า Galaxy S4 นี่มัน ดีไหม? น่าสนใจไหม? ก็เลยเขียนแสดงความเห็นส่วนตัว เผื่อว่าจะมีใครมาเจอแล้วกันครับ

samsung-galaxy-s4-i9500

หน้าตาของตัวเครื่องก็ตามภาพนะครับ เหมือนกับ Galaxy S3 จนสื่อบางที่บอกว่าเป็น S3+ หรือ S3S เลยทีเดียว โดยส่วนตัวผมคิดว่า หน้าตาจะเป็นยังไงมันไม่ค่อยสำคัญหรอกครับ เพราะว่า มันค่อนข้างจะเริ่มเป็นแนวทางเดียวกับ iPhone ของ Apple ก็คือ โอเค ฉันจะซื้อ ซัมซุง ออกมาหน้าตายังไงก็ซื้อ มันเริ่มเป็นลักษณะนั้นไปแล้ว

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

ต่อมาเรื่อง Feature หรือ ความสามารถคุณสมบัติของ Galaxy S4 ว่าดีไหม น่าสนใจไหม? เริ่มที่เรื่องสเปคเครื่อง พูดแบบสั้นๆ ง่ายๆ เข้าใจได้รวดเร็วว่า ถ้าดูตัวเลขสเปค มันเร็วสุด หรือเป็น Top แล้วของฝั่ง Android เพราะงั้นตัวเลขทางเทคนิคเหล่านั้นไม่ต้องไปคิดมากแล้วครับสมัยนี้ รู้แค่ มันคือตัว Top ก็พอ จบครับ :D

ที่ Samsung ดูผลักดัน ก็คือ ความสามารถทางด้าน Software ทั้งหลาย เช่น การหยุด Vdo เมื่อเราไม่มองจอ การใช้สายตาเลื่อนจออัตโนมัติ การเอานิ้วไปชี้ใกล้ๆ ไม่ต้องแตะจอ เพื่อดู พรีวิวอะไรบางอย่าง ซึ่งเป็นลูกเล่นที่น่าสนใจ ผมไม่อาจฟันธงว่า มันดีกว่า iPhone 5 แต่สำหรับตัวผม ถ้าถามว่า iPhone ยุคหลังๆ มีอะไรใหม่ ผมนึกออกแค่ iPhone 4S มี Siri ส่วน iPhone 5 จอยาวขึ้น อันนี้ ผมนึกถึงแค่นั้นเองจริงๆ (ผมเป็นแฟน Android โปรดใช้วิจารณญาณในการอ่าน Blog) ซึ่ง Feature ต่างๆ ผมไม่รู้ว่าผมจะพิมพ์ให้เมื่อยมือทำไม ไปดู คลิป ที่เค้าปล่อยออกมาแสดงความสามารถของ Galaxy S4 กับเถอะครับ

 

สุดท้ายนี่ สรุปสั้น โดยส่วนตัวคิดว่า นวัตกรรมฝั่ง Android ยังมีอะไรให้ตื่นเต้นอยู่ ส่วนฝั่ง iPhone รู้สึกเฉยๆ ไป 2 รุ่นแล้ว และถ้าคุณอยากเลือก Android ตัว Top ก็ขอบอกว่า Samsung Galaxy S4 เป็นคำตอบที่ดี ทั้งสำหรับ หนุ่มๆ ที่ชอบสเปค หรือสาวที่ชอบ Case น่ารักๆ เพราะมันต้องมีออกมาหลอกล่อให้ซื้ออีกมากมาย ซึ่ง ยี่ห้ออื่นผมว่ามี Case ให้เลือกน้อยกว่า Samsung

แต่ถ้าคุณอยากได้ปากกา หรือจอใหญ่กว่านี้ ก็รอ Galaxy Note 3 ต่อไปครับ

 

ปล. ทั้งหมดเป็นความคิดเห็นส่วนตัวครับ

 

NewSafari

เหตุผลที่ Safari เป็น Web Browser ที่เร็วที่สุดบน iOS?

Share Button

ก่อนอื่นต้องขอออกตัวก่อนครับว่า โดยส่วนตัวไม่ได้ใช้ iOS เลย มีก็แต่เล่นของคนอื่น ผมเป็นแฟนฝั่ง Android ครับ เพราะชอบที่มันมีทางเลือก มีอะไรให้ปรับแต่งได้เยอะถูกจริตของผมดี

หัวข้อที่โพสวันนี้มันเกิดจากที่ได้อ่านข่าวจาก Blognone ว่า ไม่มี Firefox for iOS จนกว่า Apple จะอนุญาตให้นักพัฒนาภายนอกใช้ตัวเรนเดอร์ของตนเอง ซึ่งเรื่องย่อคือ คนของทาง Firefox ได้บอกว่า จะไม่ทำ Firefox บน iOS จนกว่า Apple จะยอมให้นักพัฒนาภายนอกใช้ตัวเรนเดอร์ของตนเอง (เห้ย! ชื่อข่าวนี่หว่า)

ว่าพื้นฐานกันซักนิด ตามความเข้าใจง่ายๆ ก็คือ ตัว Web Browser เนี่ย มันจะลื่น มันจะเร็วก็อยู่ที่ ตัว Engine หรือ เครื่องยนต์กลไก ที่ใช้ในการสร้างหน้าเวปมาให้เราอ่าน แล้วตามประเด็นก็คือ Apple เค้าไม่ยอมให้ใครทำ Browser โดยทำตัว Engine ขึ้นมาเอง แต่จะต้องใช้ UIWebView ของทาง Apple ซึ่งผลสรุปง่ายๆ ก็คือ ตัว UIWebView มันทำงานได้ช้ากว่าการ ทำ Engine ขึ้นมาเองแรงๆ

ซึ่งตรงเนี้ยแหละครับ เป็นประเด็น เพราะตัว Safari บน iOS ไม่ได้ใช้ UIWebView เหมือนกับที่บังคับให้คนอื่นเค้าใช้ แต่ตัวเองไปใช้ Engine ที่ทำงานได้เร็วกว่าแทน

แล้วทีนี้ Safari จะไม่เร็วสุดได้ยังไง ในเมื่อ ไม่ยอมให้คนอื่นใช้ Engine แรงๆ

NewSafari

Application Context และ Activity ใน Android มันต่างกัน

Share Button

คือเมื่อกี้ทำ App อยู่ครับแล้วพบปัญหาแปลกๆ ค้นไปค้นมาจนพบเจอว่า Application Context มันไม่เหมือนกับ Context ที่เป็น Activity ตัวอย่างเช่น

ถ้าเราจะสร้าง Dialog ซึ่งมันต้องส่ง Context เป็น Parameter ไปซึ่งเราส่งได้ทั้งเป็น Activity คือ ส่ง MainActivity.this เข้าไปก็ได้ หรือจะส่ง ApplicationContext โดยส่ง getApplicationContext() แบบนี้ไปก็จะ Compile ผ่าน เพราะทั้งคู่คือ Context

แต่ประเด็นคือ การทำงานบางอย่าง มันจำเป็นต้องส่ง Activity เข้าไป เช่นการสร้าง Dialog หรือการ เรียก Activity ใหม่ ถ้าเราส่ง ApplicationContext เป็น Parameter จะทำให้เกิด Runtime Exception ได้ครับ

วิธีแปลง Absolute Time เป็น Realative Time ใน Android

Share Button

กำลังทำ App นึงที่ต้องการแสดงเวลาครับ ต้องการแสดงแบบ 1 hour ago, 10 minutes ago ไรแบบนั้นเหมือนใน Facebook แบบนี้เค้าเรียกว่า Relative Time ครับก็เลยลองทำดู แล้วเอามาแชร์ไว้ เผื่อจะมีใครกำลัง Search อยู่

DateUtils.getRelativeTimeSpanString(time, now, DateUtils.MINUTE_IN_MILLIS);

ประมาณข้างบนนะครับ โดย Time กับ Now เป็น Timestamp(long) ส่วน Parameter สุดท้ายเป็นหน่วยว่า อยากได้ละเอียดแค่ไหน อย่างตอนนี้ผมใช้ละเอียดระดับนาทีครับ

การทำ ImageView ให้ขยายด้านกว้างเต็มจอ และด้านสูงไม่ยืด

Share Button

พอดีผมกำลังทำ App นึงแล้วสิ่งที่ต้องการคือ การทำให้ ImageView มันขยายเต็มด้านกว้างของจอ และต้องไม่เสีย Aspect Ratio (สัดส่วน) ของภาพไป ซึ่งเท่าที่ลองค้นหาดูพบว่าไม่มีวิธีทำโดยง่าย ต้องลงไม้ลงมือเพิ่มหน่อย ก็ได้คำตอบตามลิ้งครับ คือต้อง สร้าง Class โดย Extends ImageView และแก้ไขให้มันมีการทำงานไรเพิ่มเติม

ฟังเหมือนยากนะครับ ขอสรุปสั้นๆ กดไปตามลิ้ง Copy Class นั้นไปใช้ได้เลย

 Android: How to stretch an image to the screen width while maintaining aspect ratio?

การลบข้อมูลออกจาก List เวลาทำ For-Each

Share Button

ความรู้ใหม่ ถ้าเราใช้ For Each ไล่ไปใน List เพื่อจะทำการ ลบข้อมูลบางตัวใน List

เช่น For Each ไปใน ลิสของชื่อ นร. ถ้าเจอคนไหน ชื่อขึ้นต้น ก ไก่ ให้ remove ออกจาก List

แบบนี้จะเขียน For Each ไม่ได้ จะเกิด Exception java.util.ConcurrentModificationException

เนื่องจาก ห้ามสั่ง remove list item โดยตรง ระหว่างที่ ทำการ iterate อยุ่

ต้อง ทำการสั่ง remove จาก iterator แทน โดยเขียนเป็น loop ประมาณนี้

Iterator<Data> it = newData.iterator();
while(it.hasNext()){
    if(it.next().getLink() == null){
        it.remove();
    }
}

ประเด็นคือ ต้องสั่ง it.remove(); เป็นการ ลบผ่าน iterator ไม่ใช่สั่ง newData.remove(xxxxx); ซึ่งเป็นการลบโดยตรงจาก List