การดึง Json มาใส่ Spinner (json parse to 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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
xmlns:app="http://schemas.android.com/apk/res-auto" | |
xmlns:tools="http://schemas.android.com/tools" | |
android:layout_width="match_parent" | |
android:layout_height="match_parent" | |
android:orientation="vertical" | |
tools:context=".MainActivity"> | |
<Spinner | |
android:id="@+id/car_Name" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" /> | |
</LinearLayout> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class MainActivity extends AppCompatActivity { | |
Spinner spinner; | |
ArrayList<String> CarList; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_main); | |
CarList = new ArrayList<>(); | |
spinner = findViewById(R.id.car_Name); | |
loadSpinnerData(); | |
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { | |
@Override | |
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { | |
String country = spinner.getItemAtPosition(spinner.getSelectedItemPosition()).toString(); | |
Toast.makeText(getApplicationContext(), country, Toast.LENGTH_LONG).show(); | |
} | |
@Override | |
public void onNothingSelected(AdapterView<?> adapterView) { | |
// DO Nothing here | |
} | |
}); | |
} | |
private void loadSpinnerData() { | |
Ion.with(getApplicationContext()) | |
.load("https://myappcar-wash001.000webhostapp.com/web/test.php") | |
.asString() | |
.withResponse() | |
.setCallback(new FutureCallback<com.koushikdutta.ion.Response<String>>() { | |
@Override | |
public void onCompleted(Exception e, com.koushikdutta.ion.Response<String> result) { | |
String aa = result.getResult(); | |
try { | |
JSONObject jsonObject = new JSONObject(aa); | |
JSONArray jsonArray = jsonObject.getJSONArray("Android"); | |
for (int i = 0; i < jsonArray.length(); i++) { | |
JSONObject jsonObject1 = jsonArray.getJSONObject(i); | |
String car_name= jsonObject1.getString("car_name"); | |
Log.i("zz",car_name); | |
CarList.add(car_name); | |
} | |
spinner.setAdapter(new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, CarList)); | |
} catch (JSONException e2) { | |
e.printStackTrace(); | |
} | |
} | |
}); | |
} | |
} |
ดาวโหลดซอสโค้ดได้จากตรงนี้เลย Download
ความคิดเห็น
มายังไงครับcom.koushikdutta.ion.นีนะ
ปล. CallBack คือการรับค่าคืนมาจากการทำอะไรสักอย่าง เช่น กรณีนี้คือการส่งค่าขึ้นไป Query และรับค่า (CallBack) กลับมาว่า สำเร็จ, ไม่สำเร็จ และตัวแปรต่างๆ ที่คืนกลับมาจะมีอะไรบ้าง