(تطوير UsersActivity و ListViewAdapter) ربط تطبيق أندرويد مع MySQL و PHP و JSON

السلام عليكم ورحمة الله وبركاته

(جاري تحديث الموضوع)

فهرس سلسلة دروس ربط تطبيق أندرويد مع MySQL و PHP و JSON :

  1. مقدمة وشرح توضيحي عن Web Services وعن المشروع.
  2. إعداد السيرفر المحلي WAMP و بناء قاعدة بيانات MySQL.
  3. التعامل مع PHP لبناء Web Service  تقوم بعمل Login و Register (مع شرح مبسط عن JSON) .
  4. التعامل مع PHP لبناء Web Service  بجلب بيانات المستخدمين الموجودة بقاعدة البيانات.
  5. بناء مشروع أندرويد  جديد و إعداد واجهة تطبيق الأندرويد.
  6. تطوير كلاسات Register و Login وJSONParser في أندرويد.
  7. تطوير 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

2 Comments

Add a Comment
  1. WordPress › Error

    There has been a critical error on this website.

    Learn more about troubleshooting WordPress.