Tag: برمجة

(تطوير 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

Updated: February 4, 2015 — 5:55 am

ماذا بعد تعلم لغة البرمجة ؟

programing

 

[note]أي شخص بامكانه تعلم اي لغة برمجة بكل قواعدها، لكن تعلم اللغة وحدها لا يكفي لعمل مشاريع سليمة وكود نظيف. [/note]

اغلب المبرمجين المبتدئين يتعلموا لغة برمجة وما يعرفوا يطبقوا برنامج كامل بشكل سليم او كود مرتب و نظيف

السؤال ماذا بعد تعلم لغة البرمجة ؟

هذه بعض الخطوات اللي انصحك تتعلمها وان شاء الله تقلل من تساؤلاتك

 

(أهم شي خذ راحتك في التعلم ولا تستعجل)

1- يفضل يكون عندك خلفية بسيطة عن الرياضيات خصوصا (الاحتمالات والإحصاء)

2- لغة من لغات Object-oriented

(مو شرط ان تتقنها تماما لكن لازم تعرف المفاهيم الاساسية تمام لأن الخطوات الباقية بتفهمك كل شي)

يعني لا تفكر في عمل مشروع كبير وانت لا تزال في هذه المرحلة بس افهم الاساسيات والخطوات الباقية بتقوم بالواجب 😉

3- ابحث عن دروس عن مشاريع بنفس اللغة اللي تعلمتها وطبقها

(لا تعمل نسخ ولصق) اكتب الكود بنفسك وبعد ما تكتبه ارجع اقرأه مرة ثانية وحاول تفهم محتواه (يفضل تكتب تعليقات عند كل مهمة في الكود )

4- بعد ما تشعر انك طبقت عدد مناسب من المشاريع (لمجرد التعليم) تعلم ال Algorithms

بتعلمك للخوارزميات بتغير طريقة تفكيرك في البرمجة و ستقوم بكتابة الاكواد باحترافية.

هذه كورس مجاني عن Algorithms: Design and Analysis
https://www.coursera.org/course/algo

 

5- Design Patterns
عبارة عن مجموعة انماط لحل مشاكل معينة باي لغة من لغات Object-oriented (تهم هندسة البرمجيات)
كالعلاقة بين الكلاسات (مع بعضها بكافة انواعها) وتحديد المهام عليها

هي علم وبحر واسع ويحتاج (مخمخة) لكي تستوعبه وستلاحظ حتى تطبيق الامثلة الموجودة مختلفة عن كل الامثلة اللي تعلمتها من قبل

وهذه قناة في اليوتيوب متخصصة في Object Oriented Design Patterns

https://www.youtube.com/user/zapatterns/featured

 

 إن أصبت فمن الله  وإن أخطأت فمن نفسي والشيطان 

 

[مصدر الصورة]

 

Updated: April 7, 2014 — 9:21 am