การดึง Json มาใส่ Spinner (json parse to spinner)


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

      โดยความรู้หลักที่แน่ๆ ก็ต้องเป็นเรื่อง JSON นั้นและการดึงข้อมูลจาก Web Service ซึ่งแน่นอนถ้าใครได้ลองไปค้นหาข้อมูลเกี่ยวกับ Spinner มานั้น จะเจอตัวอย่างแบบเพื่อข้อมูลเข้าใส่ Spinner เองเยอะมาก รวมไปถึงการแอดข้อมูลเอง เป็น Array บ้าง เป็น ArrayList บ้าง นั้นแหละครับเยอะมาก โดยที่ตัวอย่างนี้หลักการก็ต้องใช้ ArrayList เช่นกัน ประยุกต์กันไปครับ


โดยที่ฐานข้อมูลของผมมีดังนี้  ผมต้องการจะดึง car_name ออกมาแสดงใน Spinner นั้นต้องทำยังไง

      นั้นแหละครับที่แค่คิดอาจจะไม่ยากเลย แต่ตอนทำก็จะงงๆ โดยหลักการนั้นผมจะทำการประยุกต์ในส่วนของ Php นิดหน่อยครับ โดยที่ใช้โค้ดในส่วนนี้ลงไป echo "{Android:".json_encode($resultArray)."}"; ซึ่งในส่วนนี้ก็คือการแสดงผลให้ออกมาในรูปแบบ Json นั้นเอง แต่ผมได้ทำการในโค้ดบางส่วนเข้าไปเพื่อให้ประยุกต์กับโค้ดฝั่ง Java ได้

ดังนั้นโค้ด Php ของผมก็จะเป็นดังนี้


<?php
        include("connect.php"); 
        
     $strSQL = "SELECT * FROM car Where 1 ";

     $objQuery = mysqli_query($connection,$strSQL);
     $intNumField = mysqli_num_fields($objQuery);
     $resultArray = array();
     while($obResult = mysqli_fetch_array($objQuery))
     {
      $arrCol = array();
      for($i=0;$i<$intNumField;$i++)
      {
       $arrCol[mysqli_fetch_field_direct($objQuery,$i)->name] = $obResult[$i];
      }
      array_push($resultArray,$arrCol);
     }
     mysqli_close($connection);
     echo "{Android:".json_encode($resultArray)."}";
?>

ผลลัพธ์ของผมก็จะได้ออกมาประมาณนี้
{Android:[{"car_id":"1","car_name":"revo","car_no":"df 2550","car_type":"\u0e23\u0e16\u0e40\u0e01\u0e4b\u0e07","car_image":"https:\/\/myappcar-wash001.000webhostapp.com\/web\/photo_car\/10-03-2018_13:55:55.jpg","user_id":"2"},{"car_id":"2","car_name":"vigo","car_no":"tg2772","car_type":"\u0e23\u0e16\u0e01\u0e23\u0e30\u0e1a\u0e30","car_image":"","user_id":"2"},{"car_id":"3","car_name":"Ducati","car_no":"pt 2001","car_type":"\u0e21\u0e2d\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e44\u0e0b\u0e15\u0e4c","car_image":"","user_id":"2"},{"car_id":"4","car_name":"toyota vios","car_no":"fg 2551","car_type":"\u0e23\u0e16\u0e40\u0e01\u0e4b\u0e07","car_image":"https:\/\/myappcar-wash001.000webhostapp.com\/web\/photo_car\/15-03-2018_12:08:28.jpg","user_id":"2"}]}

หรือดูได้จาก https://myappcar-wash001.000webhostapp.com/web/test.php

เมื่อดูฝั่ง Php ไปแล้วก็มาดูฝั่ง Java บ้าง ซึ่งก็ต้องไปลงที่ xml ก่อน

ก่อนอื่นต้องใส่ตัวนี้เข้าไปก่อน

implementation 'com.koushikdutta.ion:ion:2.+'

activity_main.xml
MainActivity.java
โดยสำคัญที่ Method loadSpinnerData()  เราจะทำการส่ง request ไปหา Url เพื่อให้มันส่งค่ากลับมาโดยตัวนี้ได้ใช้ไลบรารี่ (Ion) จากนั้นรับค่ากลับมาเป็น aa แล้วแปลงเป็น JsonObject แล้วแปลงเป็น JsonArray ใน "Android" จากนั้นก็ใช้ For วนๆใน String "car_name" ซึ่งก็คือฟิลของฐานข้อมูลนั้นเอง มาเก็บใน car_name แล้ว add ใน CarList ซึ่งเป็น ArrayList แล้วใส่ใน Adapter เป็นอันจบ

ดาวโหลดซอสโค้ดได้จากตรงนี้เลย Download

ความคิดเห็น

Unknown กล่าวว่า
.setCallback(new FutureCallback>() {
มายังไงครับcom.koushikdutta.ion.นีนะ
Tanat29 กล่าวว่า
เป็น CallBack ของ Library อยู่แล้วครับ สามารถใส่ตามนั้นได้เลยครับ

ปล. CallBack คือการรับค่าคืนมาจากการทำอะไรสักอย่าง เช่น กรณีนี้คือการส่งค่าขึ้นไป Query และรับค่า (CallBack) กลับมาว่า สำเร็จ, ไม่สำเร็จ และตัวแปรต่างๆ ที่คืนกลับมาจะมีอะไรบ้าง

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

การรับค่า ส่งค่าจากหน้าที่ 1 ไปหน้าที่ 2 บน Flutter (How to pass data between screens in Flutter?)

การจับเวลาบน Flutter ทำยังไง (How to count up timer flutter?)

วิธีการสลับข้อมูล MySQL ในคอลัมน์เดียวกัน