السلام عليكم ورحمة الله وبركاته
(جاري تحديث الموضوع)
فهرس سلسلة دروس ربط تطبيق أندرويد مع 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: ahmad@ahmadssb.com
* 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: ahmad@ahmadssb.com
* 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