TShopping

 找回密碼
 註冊
搜索
查看: 487|回復: 0

[教學] 如何從Mysql 抓資料,動態新增TextView至TableLayout

[複製鏈接]
發表於 2016-2-18 00:00:00 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk Push to Twitter 
layout/main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="vertical" >      

  6.     <Button
  7.         android:id="@+id/get_record"
  8.         android:layout_width="wrap_content"
  9.         android:layout_height="wrap_content"
  10.         android:layout_gravity="center_horizontal"
  11.         android:text="抓資料囉!" />


  12.     <TableLayout
  13.         android:id="@+id/user_list"
  14.         android:layout_width="match_parent"
  15.         android:layout_height="wrap_content" />

  16. </LinearLayout>
複製代碼

先在本機端建立與資料庫連線的PHP檔
將ResultSet以JSON的格式回傳
www/AndroidConnectDB/android_connect_db.php
  1. <?php
  2. $db = mysql_pconnect("localhost","user","pwd");

  3. mysql_query("SET CHARACTER SET 'UTF8';");
  4. mysql_query('SET NAMES UTF8;');
  5. mysql_query('SET CHARACTER_SET_CLIENT=UTF8;');
  6. mysql_query('SET CHARACTER_SET_RESULTS=UTF8;');
  7. mysql_select_db("database");

  8. $sql = $_POST['query_string'];
  9. $sql = stripslashes($sql);
  10. $res = mysql_query($sql);
  11. while($r = mysql_fetch_assoc($res))
  12.     $output[] = $r;

  13. print(json_encode($output));

  14. mysql_close();

  15. ?>
複製代碼

建立一個JAVA類別來呼叫PHP
將JSON以String型態傳給Activity處理

  1. import java.io.BufferedReader;
  2. import java.io.InputStream;
  3. import java.io.InputStreamReader;
  4. import java.util.ArrayList;

  5. import org.apache.http.HttpEntity;
  6. import org.apache.http.HttpResponse;
  7. import org.apache.http.NameValuePair;
  8. import org.apache.http.client.HttpClient;
  9. import org.apache.http.client.entity.UrlEncodedFormEntity;
  10. import org.apache.http.client.methods.HttpPost;
  11. import org.apache.http.impl.client.DefaultHttpClient;
  12. import org.apache.http.message.BasicNameValuePair;
  13. import org.apache.http.protocol.HTTP;

  14. public class DBConnector {
  15.     public static String executeQuery(String query_string) {
  16.         String result = "";
  17.         
  18.         try {
  19.             HttpClient httpClient = new DefaultHttpClient();
  20.             HttpPost httpPost = new HttpPost("http://10.0.2.2/AndroidConnectDB/android_connect_db.php");
  21.             ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
  22.             params.add(new BasicNameValuePair("query_string", query_string));
  23.             httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
  24.             HttpResponse httpResponse = httpClient.execute(httpPost);
  25.             //view_account.setText(httpResponse.getStatusLine().toString());
  26.             HttpEntity httpEntity = httpResponse.getEntity();
  27.             InputStream inputStream = httpEntity.getContent();
  28.             
  29.             BufferedReader bufReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"), 8);
  30.             StringBuilder builder = new StringBuilder();
  31.             String line = null;
  32.             while((line = bufReader.readLine()) != null) {
  33.                 builder.append(line + "\n");
  34.             }
  35.             inputStream.close();
  36.             result = builder.toString();
  37.         } catch(Exception e) {
  38.             // Log.e("log_tag", e.toString());
  39.         }
  40.         
  41.         return result;
  42.     }
  43. }
複製代碼


在Activity端,將JSON字串轉成JSON陣列
以迴圈建立TableRow物件,加到Layout中
  1. import org.json.JSONArray;
  2. import org.json.JSONObject;

  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.os.StrictMode;
  6. import android.util.Log;
  7. import android.view.Gravity;
  8. import android.view.View;
  9. import android.view.ViewGroup.LayoutParams;
  10. import android.widget.Button;
  11. import android.widget.TableLayout;
  12. import android.widget.TableRow;
  13. import android.widget.TextView;


  14. public class TestAndroidDBActivity extends Activity {

  15.     @Override
  16.     public void onCreate(Bundle savedInstanceState) {
  17.         super.onCreate(savedInstanceState);
  18.         setContentView(R.layout.main);
  19.         
  20.         findViews();
  21.         setListeners();
  22.         
  23.         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()  
  24.         .detectDiskReads()  
  25.         .detectDiskWrites()  
  26.         .detectNetwork()  
  27.         .penaltyLog()  
  28.         .build());  
  29.         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()  
  30.         .detectLeakedSqlLiteObjects()   
  31.         .penaltyLog()  
  32.         .penaltyDeath()  
  33.         .build());  
  34.     }
  35.    
  36.     private Button button_get_record;
  37.    
  38.     private void findViews() {
  39.         button_get_record = (Button)findViewById(R.id.get_record);
  40.     }
  41.    
  42.     private void setListeners() {
  43.         button_get_record.setOnClickListener(getDBRecord);
  44.     }
  45.    
  46.     private Button.OnClickListener getDBRecord = new Button.OnClickListener() {
  47.         public void onClick(View v) {
  48.             // TODO Auto-generated method stub
  49.             TableLayout user_list = (TableLayout)findViewById(R.id.user_list);
  50.             user_list.setStretchAllColumns(true);
  51.             TableLayout.LayoutParams row_layout = new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
  52.             TableRow.LayoutParams view_layout = new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
  53.             try {
  54.                 String result = DBConnector.executeQuery("SELECT * FROM user");
  55.                
  56.                 /*
  57.                     SQL 結果有多筆資料時使用JSONArray
  58.                     只有一筆資料時直接建立JSONObject物件
  59.                     JSONObject jsonData = new JSONObject(result);
  60.                 */
  61.                 JSONArray jsonArray = new JSONArray(result);
  62.                 for(int i = 0; i < jsonArray.length(); i++) {
  63.                     JSONObject jsonData = jsonArray.getJSONObject(i);
  64.                     TableRow tr = new TableRow(TestAndroidDBActivity.this);
  65.                     tr.setLayoutParams(row_layout);
  66.                     tr.setGravity(Gravity.CENTER_HORIZONTAL);
  67.                     
  68.                     TextView user_acc = new TextView(TestAndroidDBActivity.this);
  69.                     user_acc.setText(jsonData.getString("account"));
  70.                     user_acc.setLayoutParams(view_layout);
  71.                     
  72.                     TextView user_pwd = new TextView(TestAndroidDBActivity.this);
  73.                     user_pwd.setText(jsonData.getString("pwd"));
  74.                     user_pwd.setLayoutParams(view_layout);
  75.                     
  76.                     tr.addView(user_acc);
  77.                     tr.addView(user_pwd);
  78.                     user_list.addView(tr);
  79.                 }
  80.             } catch(Exception e) {
  81.                 // Log.e("log_tag", e.toString());
  82.             }
  83.         }
  84.     };
  85. }
複製代碼


資料表內的資料
資料表

Activity執行前
執行前
1.png
Activity執行後
執行後
2.png
文章來源

 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2016-12-11 20:08 , Processed in 0.060891 second(s), 26 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表