السلام عليكم ورحمة الله وبركاته
(جاري تحديث الموضوع)
فهرس سلسلة دروس ربط تطبيق أندرويد مع MySQL و PHP و JSON :
- مقدمة وشرح توضيحي عن Web Services وعن المشروع.
- إعداد السيرفر المحلي WAMP و بناء قاعدة بيانات MySQL.
- التعامل مع PHP لبناء Web Service تقوم بعمل Login و Register (مع شرح مبسط عن JSON) .
- التعامل مع PHP لبناء Web Service بجلب بيانات المستخدمين الموجودة بقاعدة البيانات.
- بناء مشروع أندرويد جديد و إعداد واجهة تطبيق الأندرويد.
- تطوير كلاسات Register و Login وJSONParser في أندرويد.
- تطوير UsersActivity و ListViewAdapter لعمل قائمة المستخدمين بالتنسيق الذي نحتاجه.
ListViewAdapter.java
/*** * @author Ahmed Saleh * Created by ahmadssb on 2014-12-13 * Website: http://www.ahmadssb.com * Email: [email protected] * Facebook: https://www.facebook.com/ahmadssbblog * Twitter: https://twitter.com/ahmadssb * YouTube: http://www.youtube.com/user/ahmadssbblog */ package com.ahmaadssb.androidwebservices; import java.util.ArrayList; import java.util.HashMap; import android.content.Context; import android.content.Intent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class ListViewAdapter extends BaseAdapter { // نقوم بتعريف المتغيرات المطلوبة Context context; LayoutInflater inflater; ArrayList<HashMap<String, String>> data; HashMap<String, String> resultp = new HashMap<String, String>(); // تعريف الكونستركتر // حيث يحتوي على المتغيرات //context = اسم الكلاس // arraylist = مصفوفة users التي سنحصل عليها من JSONArray public ListViewAdapter(Context context, ArrayList<HashMap<String, String>> arraylist) { this.context = context; // هنا سنتعامل مع المصفوفة التي حصلنا عليها من الكونستركتر لكي نتحكم بمحتوياتها ونضعها في single_user_layout data = arraylist; } @Override public int getCount() { // نحصل على حجم data // والتي هي عدد مصفوفة JSON return data.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } /*** * في هذه الدالة سنقوم بالربط مع single_user_layout * و نقوم بتعريف كل كائن TextView * و من ثم نقوم بأخذ القيم الموجودة في data * وربطها مع كل TextView */ public View getView(final int position, View convertView, ViewGroup parent) { // تعريف متغيرات TextView المطلوبة TextView tvUserID, tvUsername, tvDisplayName; // نقوم بتعريف inflater // LayoutInflater : توضيح مبسط // يسمح لك بتحويل اي كائن (نص-زر-صورة...الخ) الى View Objects inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); // نقوم بتعريف itemView Object // inflater.inflate (int resource, ViewGroup root, boolean attachToRoot) // resource = single_user_layout بمعنى التصميم الذي تود التحكم بمحتوياته // ViewGroup root = parent نفس الباراميتر الموجود في getViwe() و الهدف منه الحصول على أول عنصر في ملف التصميم View itemView = inflater.inflate(R.layout.single_user_layout, parent, false); // نحصل على موضع الداتا // بمعنى آخر ان كان هناك 4 مستخدمين حصلنا على بياناتهم من JSON Array // كل مستخدم له مصفوفة تحتوي على id - username - displayname // هنا نحن نحدد موضع المصفوفة للمستخدم // فإذا كانت 2 سنحصل على بيانات المستخدم رقم 2 resultp = data.get(position); // نقوم بتعين كل متغير TextView بما هو موجود في ملف single_user_layout tvUserID = (TextView) itemView.findViewById(R.id.txtID); tvUsername = (TextView) itemView.findViewById(R.id.txtUsername); tvDisplayName = (TextView) itemView.findViewById(R.id.txtDisplayName); // نقوم بوضع بيانات TextView في أماكنها tvUserID.setText(resultp.get(UsersActivity.TAG_USER_ID)); tvUsername.setText(resultp.get(UsersActivity.TAG_USER_USERNAME)); tvDisplayName.setText(resultp.get(UsersActivity.TAG_USER_DISPLAYNAME)); // اخيرا نقوم بإرجاع itemView return itemView; } }
UsersActivity.java
/*** * @author Ahmed Saleh * Created by ahmadssb on 2014-12-13 * Website: http://www.ahmadssb.com * Email: [email protected] * Facebook: https://www.facebook.com/ahmadssbblog * Twitter: https://twitter.com/ahmadssb * YouTube: http://www.youtube.com/user/ahmadssbblog */ package com.ahmaadssb.androidwebservices; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.apache.http.NameValuePair; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Toast; public class UsersActivity extends Activity { // Declare Variables JSONObject jsonobject; JSONArray jsonArrayUsers; ListView listview; ListViewAdapter adapterListView; ProgressDialog mProgressDialog; ArrayList<HashMap<String, String>> arraylistUsers; // JSON parser Class JSONParser jsonParser = new JSONParser(); // من خلال شبكة الواي فاي private static String USERS_URL = "http://192.168.1.103/GoogleDrive/android-webservice1/users.php"; // من خلال Android emulator // private static String USERS_URL = "http://10.0.2.2/GoogleDrive/android-webservice1/users.php"; // من خلال رابط الموقع على الانترنت // private static String USERS_URL = "http://www.YOUR-DOMAIN.com/GoogleDrive/android-webservice1/users.php"; // JSON IDS: static final String TAG_SUCCESS = "success"; static final String TAG_USERS_LIST = "users"; static final String TAG_USER_ID = "id"; static final String TAG_USER_USERNAME = "username"; static final String TAG_USER_DISPLAYNAME = "displayname"; private static final String TAG_MESSAGE = "message"; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.users_layout); new DownloadJSON().execute(); } /*** * * @author Ahmadssb * في هذا الكلاس سنقوم بالإتصال برابط تسجيل مستخدم جديد ونقوم * ومن ثم نحصل على JSON Response * وأخيرا حسب قيمة success نقرر ما سنقوم بعمله * */ private class DownloadJSON extends AsyncTask<Void, Void, Void> { int status; @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Void doInBackground(Void... params) { // نقوم بتعريف ArrayList arraylistUsers = new ArrayList<HashMap<String, String>>(); try { List<NameValuePair> param = new ArrayList<NameValuePair>(); //فقط لتتبع ما يحصل في LogCat Log.d("request!", "Starting"); // نقوم بارسال طلب POST الى رابط Users // للحصول على JSON Objects jsonobject = JSONParser.makeHttpRequest(USERS_URL,"POST",param); //فقط لتتبع ما يحصل في LogCat Log.d("Loding Restaurant", jsonobject.toString()); // نضع قيمة success والتي حصلنا عليها من JSON // بداخل المتغير success status = jsonobject.getInt(TAG_SUCCESS); if(status != 0) { // نقوم بالحصول على مصفوفة users في JSON jsonArrayUsers = jsonobject.getJSONArray(TAG_USERS_LIST); for (int i = 0; i < jsonArrayUsers.length(); i++) { HashMap<String, String> map = new HashMap<String, String>(); JSONObject jsonobject = jsonArrayUsers.getJSONObject(i); // نقوم بالحصول على JSON Objects مع قيمة كل Object // ونقوم بحفظها في كائن HashMap map.put(TAG_USER_ID, jsonobject.getString(TAG_USER_ID)); map.put(TAG_USER_USERNAME, jsonobject.getString(TAG_USER_USERNAME)); map.put(TAG_USER_DISPLAYNAME, jsonobject.getString(TAG_USER_DISPLAYNAME)); // نقوم بحفظ البيانات المخزنة في map بداخل arraylistUsers arraylistUsers.add(map); } //فقط لتتبع ما يحصل في LogCat Log.d("jsonArrayKioskRestaurant Size:", ""+arraylistUsers.size()); }else{ //فقط لتتبع ما يحصل في LogCat Log.d("Loding Restaurant Failure!", jsonobject.getString(TAG_MESSAGE)); } } catch (JSONException e) { Log.e("Error", e.getMessage()); e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void args) { if (status != 0) { // أولا نقوم بتعريف listView listview = (ListView) findViewById(R.id.listView1); // نقوم بإرسال بيانات المصفوفة arraylistUsers بداخل ListViewAdapter // حيث ان ListViewAdapter سيتكفل بتنسيق البيانات adapterListView = new ListViewAdapter(UsersActivity.this, arraylistUsers); // نقوم بتعيين adapterListView بداخل listView listview.setAdapter(adapterListView); // في حال كنت تريد ان تقوم بتنفيذ امر معين عند النقر على احد الحقول في ListView // عليك استدعاء الدالة setOnItemClickListener() listview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { TextView tvUserID = (TextView) (arg1.findViewById(R.id.txtID)); String sUserID = tvUserID.getText().toString(); TextView tvUsername = (TextView) (arg1.findViewById(R.id.txtUsername)); String sUsername = tvUsername.getText().toString(); TextView tvDisplayName = (TextView) (arg1.findViewById(R.id.txtDisplayName)); String sDisplayName = tvDisplayName.getText().toString(); Toast.makeText(UsersActivity.this, sUserID + " - " + sUsername + " - " + sDisplayName, Toast.LENGTH_LONG).show(); } }); } } } }
بإمكانك تحميل المشروع من خلال GitHub :
https://github.com/ahmadssb/Android-PHP-MySQL-JSON-Tutorial.git