انجمن سایت کلیدستان


رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
رفرش کردن گریدویو بعد از انجام اپدیت

رفرش کردن گریدویو بعد از انجام اپدیت

#1
سلام
وقت بخیر
من برای نمایش یک سری اطلاعات از گریدویو اختصاصی استفاده می کنم با کد های زیر :
کد پی‌اچ‌پی:
        for (int i 0<savei++) {
            
            
Goroh[i]= db.ngoroh("khanevade"i1);
            
model[i]= db.ngoroh("khanevade"i11);
            }
        
        
        
CustomGrid adapter = new CustomGrid(getActivity(), GorohimageId);
        
grid.setAdapter(adapter); 
برای دریافت اطلاعات از سرور و ذخیره اطلاعات در دیتابیس برنامه هم از AsyncTask استفاده می کنم، در قسمت onProgressUpdate سعی کردم با متد زیر گریدویو رو رفرش کنم :

@Override
            protected void onProgressUpdate(String... values) {
                new Runnable() {

                    @Override
                    public void run() {
                        refresher();
                        
                    }
                    
                };
                super.onProgressUpdate(values);
            }

اما متاسفانه کار نمیکنه

کد های کامل برنامه :
کد پی‌اچ‌پی:
public class Khanevadeh extends Fragment {
    private static final 
String TAG_SUCCESS "success";
    private static final 
String TAG_PRODUCTS "products";
    private static final 
String TAG_ID "id";
    private static final 
String TAG_GOROH "goroh";
    private static final 
String TAG_ZIRGOROH "zirgoroh";
    private static final 
String TAG_NAME "name";
    private static final 
String TAG_MATN "matn";
    private static final 
String TAG_TASVIR "tasvir";
    private static final 
String TAG_LIKE "like";
    private static final 
String TAG_RATE "rate";
    private static final 
String TAG_MODEL "model";
    private static 
String url_all_products "http://aghsatiha.com/bparsi/khanevade_update.php";
    
JSONParser jParser = new JSONParser();
    private 
database db;
    
String id;
    
JSONArray products null;
    
GridView grid;
    
String[] Goroh;
    
String[] model;
    
int[] imageId = {
            
R.drawable.image1,
            
R.drawable.image2,
            
R.drawable.image3,
            
R.drawable.image4,
            
R.drawable.image5
    
};
 
    @
Override
    
public View onCreateView(LayoutInflater inflaterViewGroup container,
            
Bundle savedInstanceState) {
        
// inflate the root view of the fragment
        
View fragmentView inflater.inflate(R.layout.khanevadehcontainerfalse);
        
db = new database(getActivity());
        
db.open();
        
setHasOptionsMenu(true);
        
id db.akharinid("khanevade"0);
        
grid=(GridView)fragmentView.findViewById(R.id.grid_khanevadeh);
        
        
refresher();
        

        return 
fragmentView;
    }

    private 
void refresher() {
        
        
int save db.shgoroh("khanevade");
        
Goroh = new String [save];
        
model = new String [save];
        
        for (
int i 0<savei++) {
            
            
Goroh[i]= db.ngoroh("khanevade"i1);
            
model[i]= db.ngoroh("khanevade"i11);
            }
        
        
        
CustomGrid adapter = new CustomGrid(getActivity(), GorohimageId);
        
grid.setAdapter(adapter);
        
        
grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @
Override
            
public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                
                if (model[position].equals("1")) {
                    Intent intent = new Intent(getActivity(), Onvanha_khanevadeh.class);
                    intent.putExtra("goroh", Goroh[position]);
                    intent.putExtra("zirgoroh", "0");
                    startActivity(intent);
                } else {
                    Intent intent = new Intent(getActivity(), Zirgoroh_khanevadeh.class);
                    intent.putExtra("goroh", Goroh[position]);
                    startActivity(intent);
                }
                
            }
            
            
            
        });

    }
    
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
       inflater.inflate(R.menu.main, menu);
    }
    
    public void showToast(String msg){
        Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();
    }
    
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
         
            case R.id.refresh:
                NetAsync(getView());
                return true;
     
            case R.id.copyLink:
                showToast("Copy link was clicked.");
                return true;
     
            case R.id.share:
                showToast("Share was clicked.");
                return true;
     
            case R.id.action_settings: 
                showToast("actionsettings was clicked.");
                  return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    
    public void NetAsync(View view){
        
        new NetCheck().execute();

    }

    private class NetCheck extends AsyncTask<String,String,Boolean> {
        private ProgressDialog nDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            nDialog = new ProgressDialog(getActivity());
            nDialog.setMessage("Loading..");
            nDialog.setTitle("Checking Network");
            nDialog.setIndeterminate(false);
            nDialog.setCancelable(true);
            nDialog.show();
        }
        
        
        @Override
        protected Boolean doInBackground(String... params) {
            /**
             * Gets current device state and checks for working internet connection by trying Google.
             **/
                        ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
                        NetworkInfo netInfo = cm.getActiveNetworkInfo();
                        if (netInfo != null && netInfo.isConnected()) {
                            try {
                                URL url = new URL("http://www.google.com");
                                HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
                                urlc.setConnectTimeout(3000);
                                urlc.connect();
                                if (urlc.getResponseCode() == 200) {
                                    return true;
                                }
                            } catch (MalformedURLException e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                        return false;
        }
        @Override
        protected void onPostExecute(Boolean result) {
            
            if (result==true) {
                nDialog.dismiss();
                new ProcessUpdatedb().execute();
                
            } else {
                nDialog.dismiss();
                Toast.makeText(getActivity(), "مشکل در ارتباط با اینترنت", Toast.LENGTH_SHORT).show();

            }
            
            
        }
        
    }
        
        
    private class ProcessUpdatedb extends AsyncTask<String, String, JSONObject> {
        private ProgressDialog pDialog;
        
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
         pDialog = new ProgressDialog(getActivity());
         pDialog.setTitle("Contacting Servers");
         pDialog.setMessage("Updating Database ...");
         pDialog.setIndeterminate(false);
         pDialog.setCancelable(true);
         pDialog.show();
         
         
        }

            @Override
            protected JSONObject doInBackground(String... params) {
                // Building Parameters
                
                
                            List<NameValuePair> params1 = new ArrayList<NameValuePair>();
                            params1.add(new BasicNameValuePair("id", id));
                            JSONObject json = jParser.getJSONFromUrl(url_all_products, params1);
                                    
                            Log.d("All Products: ", json.toString());
                            try {
                                int success = json.getInt(TAG_SUCCESS);
                                if (success == 1) {
                                    products = json.getJSONArray(TAG_PRODUCTS);
                                    for (int i = 0; i < products.length(); i++) {
                                        JSONObject c = products.getJSONObject(i);
                                        String id = c.getString(TAG_ID);
                                        String goroh = c.getString(TAG_GOROH);
                                        String zirgoroh = c.getString(TAG_ZIRGOROH);
                                        String name = c.getString(TAG_NAME);
                                        String matn = c.getString(TAG_MATN);
                                        String tasvir = c.getString(TAG_TASVIR);
                                        String like = c.getString(TAG_LIKE);
                                        String rate = c.getString(TAG_RATE);
                                        String model = c.getString(TAG_MODEL);
                                        
                                        db.update_khanevade(id, goroh, zirgoroh, name, matn, tasvir, like, rate, model);
                                        
                                    }
                                    

                                } else {
                                    // no products found
                                    // Launch Add New product Activity
                                    Intent i = new Intent(getActivity(),MainActivity.class);
                                    // Closing all previous activities
                                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                    startActivity(i);
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }

                            return null;
        }
            
            @Override
            protected void onProgressUpdate(String... values) {
                new Runnable() {

                    @Override
                    public void run() {
                        refresher();
                        
                    }
                    
                };
                super.onProgressUpdate(values);
            }
            
            @Override
            protected void onPostExecute(JSONObject result) {
                pDialog.dismiss();
                Toast.makeText(getActivity(), "آپدیت شد حالشو ببر پسر", Toast.LENGTH_SHORT).show();
                
                super.onPostExecute(result);
            }    
    

    }



برای رفرش گریدویو باید چه دستوراتی و چجوری به کار ببرم؟
پاسخ

رفرش کردن گریدویو بعد از انجام اپدیت

#2
من دقیق نفهمیدم منظورتون چیه؟..کدتون دقیق مطالعه نکردم..منظورتون از رفرش گرید ویو  اینه که مقادیر جدید گرفته شده نمایش داده بشه؟یا چیزه دیگه؟
اگر منظورتون اینه...مگه گرید ویو شما دو تا آرایه نداره که بر اساس اونا گرید ویو خودتون مقدار دهی میکنید؟..حالا رفتید مقادیر جدید رو از اینترنت گرفتید و میخواید داخل گرید ویو نشون دهید؟..
خب کافیه مقادیر بگیرید بعد از اینکه AsyncTask شما با موفقیت مقدار گرفت.کافیه اون بریز داخل آرایه جدید..یکبار دیگه SetAdapter رو روی گرید ویو اعمال کنید..
نمیدونم منظورتون همین بود یانه
پاسخ
 سپاس شده توسط admin

رفرش کردن گریدویو بعد از انجام اپدیت

#3
دقیقا منظورم همین که شما گفتید هست و همینکاری که شما گفتید رو هم انجام میدم اما کار نمیکنه و ایتم های جدید اضافه نمیشه و حتما باید اکتیویتی رو عوض کنم مجدد وارد شم تا ایتم های جدید رو ببینم
من در اسینک تسک این ها رو برای اینکار نوشتم :

protected void onProgressUpdate(String... values) {
                
                int save = db.shgoroh("khanevade");
                Goroh = new String [save];
                model = new String [save];
                
                for (int i = 0; i <save; i++) {
                    
                    Goroh[i]= db.ngoroh("khanevade", i, 1);
                    model[i]= db.ngoroh("khanevade", i, 11);
                    }
                CustomGrid adapter = new CustomGrid(getActivity(), Goroh, imageId);
                grid.setAdapter(adapter);
                
                
            }

کد های کامل رو هم میزارم ممنون میشم چک کنید ببینید ایراد کارم کجاست :

کد پی‌اچ‌پی:
package com.banooyeparsi.srp.khanevadeh;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.banooyeparsi.srp.MainActivity;
import com.banooyeparsi.srp.R;
import com.banooyeparsi.srp.adapter.CustomGrid;
import com.banooyeparsi.srp.adapter.JSONParser;
import com.banooyeparsi.srp.adapter.database;

import android.support.v4.app.Fragment;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;

public class 
Khanevadeh extends Fragment {
    private static final 
String TAG_SUCCESS "success";
    private static final 
String TAG_PRODUCTS "products";
    private static final 
String TAG_ID "id";
    private static final 
String TAG_GOROH "goroh";
    private static final 
String TAG_ZIRGOROH "zirgoroh";
    private static final 
String TAG_NAME "name";
    private static final 
String TAG_MATN "matn";
    private static final 
String TAG_TASVIR "tasvir";
    private static final 
String TAG_LIKE "like";
    private static final 
String TAG_RATE "rate";
    private static final 
String TAG_MODEL "model";
    private static 
String url_all_products "http://aghsatiha.com/bparsi/khanevade_update.php";
    
JSONParser jParser = new JSONParser();
    private 
database db;
    
String id;
    
JSONArray products null;
    
GridView grid;
    
String[] Goroh;
    
String[] model;
    
int[] imageId = {
            
R.drawable.image1,
            
R.drawable.image2,
            
R.drawable.image3,
            
R.drawable.image4,
            
R.drawable.image5
    
};
 
    @
Override
    
public View onCreateView(LayoutInflater inflaterViewGroup container,
            
Bundle savedInstanceState) {
        
// inflate the root view of the fragment
        
View fragmentView inflater.inflate(R.layout.khanevadehcontainerfalse);
        
db = new database(getActivity());
        
db.open();
        
setHasOptionsMenu(true);
        
id db.akharinid("khanevade"0);
        
grid=(GridView)fragmentView.findViewById(R.id.grid_khanevadeh);
        
        
int save db.shgoroh("khanevade");
        
Goroh = new String [save];
        
model = new String [save];
        
        for (
int i 0<savei++) {
            
            
Goroh[i]= db.ngoroh("khanevade"i1);
            
model[i]= db.ngoroh("khanevade"i11);
            }
        
        
        
CustomGrid adapter = new CustomGrid(getActivity(), GorohimageId);
        
grid.setAdapter(adapter);
        
        
grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @
Override
            
public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                
                if (model[position].equals("1")) {
                    Intent intent = new Intent(getActivity(), Onvanha_khanevadeh.class);
                    intent.putExtra("goroh", Goroh[position]);
                    intent.putExtra("zirgoroh", "0");
                    startActivity(intent);
                } else {
                    Intent intent = new Intent(getActivity(), Zirgoroh_khanevadeh.class);
                    intent.putExtra("goroh", Goroh[position]);
                    startActivity(intent);
                }
                
            }
            
            
            
        });
        

        return fragmentView;
    }


    
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
       inflater.inflate(R.menu.main, menu);
    }
    
    public void showToast(String msg){
        Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();
    }
    
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
         
            case R.id.refresh:
                NetAsync(getView());
                return true;
     
            case R.id.copyLink:
                showToast("Copy link was clicked.");
                return true;
     
            case R.id.share:
                showToast("Share was clicked.");
                return true;
     
            case R.id.action_settings: 
                showToast("actionsettings was clicked.");
                  return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    
    public void NetAsync(View view){
        
        new NetCheck().execute();

    }

    private class NetCheck extends AsyncTask<String,String,Boolean> {
        private ProgressDialog nDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            nDialog = new ProgressDialog(getActivity());
            nDialog.setMessage("Loading..");
            nDialog.setTitle("Checking Network");
            nDialog.setIndeterminate(false);
            nDialog.setCancelable(true);
            nDialog.show();
        }
        
        
        @Override
        protected Boolean doInBackground(String... params) {
            /**
             * Gets current device state and checks for working internet connection by trying Google.
             **/
                        ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
                        NetworkInfo netInfo = cm.getActiveNetworkInfo();
                        if (netInfo != null && netInfo.isConnected()) {
                            try {
                                URL url = new URL("http://www.google.com");
                                HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
                                urlc.setConnectTimeout(3000);
                                urlc.connect();
                                if (urlc.getResponseCode() == 200) {
                                    return true;
                                }
                            } catch (MalformedURLException e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                        return false;
        }
        @Override
        protected void onPostExecute(Boolean result) {
            
            if (result==true) {
                nDialog.dismiss();
                new ProcessUpdatedb().execute();
                
            } else {
                nDialog.dismiss();
                Toast.makeText(getActivity(), "مشکل در ارتباط با اینترنت", Toast.LENGTH_SHORT).show();

            }
            
            
        }
        
    }
        
        
    private class ProcessUpdatedb extends AsyncTask<String, String, JSONObject> {
        private ProgressDialog pDialog;
        
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
         pDialog = new ProgressDialog(getActivity());
         pDialog.setTitle("Contacting Servers");
         pDialog.setMessage("Updating Database ...");
         pDialog.setIndeterminate(false);
         pDialog.setCancelable(true);
         pDialog.show();
         
         
        }

            @Override
            protected JSONObject doInBackground(String... params) {
                // Building Parameters
                
                
                            List<NameValuePair> params1 = new ArrayList<NameValuePair>();
                            params1.add(new BasicNameValuePair("id", id));
                            JSONObject json = jParser.getJSONFromUrl(url_all_products, params1);
                                    
                            Log.d("All Products: ", json.toString());
                            try {
                                int success = json.getInt(TAG_SUCCESS);
                                if (success == 1) {
                                    products = json.getJSONArray(TAG_PRODUCTS);
                                    for (int i = 0; i < products.length(); i++) {
                                        JSONObject c = products.getJSONObject(i);
                                        String id = c.getString(TAG_ID);
                                        String goroh = c.getString(TAG_GOROH);
                                        String zirgoroh = c.getString(TAG_ZIRGOROH);
                                        String name = c.getString(TAG_NAME);
                                        String matn = c.getString(TAG_MATN);
                                        String tasvir = c.getString(TAG_TASVIR);
                                        String like = c.getString(TAG_LIKE);
                                        String rate = c.getString(TAG_RATE);
                                        String model = c.getString(TAG_MODEL);
                                        
                                        db.update_khanevade(id, goroh, zirgoroh, name, matn, tasvir, like, rate, model);
                                        
                                    }
                                    

                                } else {
                                    // no products found
                                    // Launch Add New product Activity
                                    Intent i = new Intent(getActivity(),MainActivity.class);
                                    // Closing all previous activities
                                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                    startActivity(i);
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }

                            return null;
        }
            
            @Override
            protected void onProgressUpdate(String... values) {
                
                int save = db.shgoroh("khanevade");
                Goroh = new String [save];
                model = new String [save];
                
                for (int i = 0; i <save; i++) {
                    
                    Goroh[i]= db.ngoroh("khanevade", i, 1);
                    model[i]= db.ngoroh("khanevade", i, 11);
                    }
                CustomGrid adapter = new CustomGrid(getActivity(), Goroh, imageId);
                grid.setAdapter(adapter);
                
                
            }
            
            @Override
            protected void onPostExecute(JSONObject result) {
                pDialog.dismiss();
                Toast.makeText(getActivity(), "آپدیت شد حالشو ببر پسر", Toast.LENGTH_SHORT).show();
                
                super.onPostExecute(result);
            }    
    

    }


 
پاسخ

رفرش کردن گریدویو بعد از انجام اپدیت

#4
بزارید یه نکته ای رو بگم :شاید بعدا به کمکتون اومد:
دوست عزیز پروگرس بار شما قابلیت کنسل شدن داره.یعنی وقتی کاربر دکمه بک گوشی بزنه progressBar از بین میره..بزارید یه مثال بزنم :فرض کنید من کاربر دکمه آپدیت برنامه رو زدم.پنجره progress برای من نمایش داده میشه..ممکن سرعت اینترنت پایین باشه اون لحظه و فرایند دانلود طول بکشه..بخاطر همین پشیمون میشم و دکمه بک گوشی میزنم...یا از برنامه خارج میشم یا وارد اکتیویتی های دیگه میشم..ولی فرایند دانلود داره ادامه پیدا میکنه تا تموم بشه..بعد از اینکه تموم شد.به دستورات نظیر زیر میرسید

کد:
Toast.makeText(getBaseContext(), "آپدیت شد حالشو ببر پسر", Toast.LENGTH_SHORT).show();

چون کاربر از برنامه خارج شده،این خط ارور میده و برنامه بسته میشه..چون دستور getBaseContext() نمیتونه کانتکس مورد نظر رو پیدا کنه.(متاسفانه خیلی از نرم افزارها اصلا به این نکته توجه ندارند که این موارد رو کنترل کنند).یا دستوراتی مانند ذخیره کردند در دیتابیس بعد از اتمام دانلود..
این واسه آگاهی داشتن از این دست موارد..

حالا واسه مشکل برنامه تون:نمیدونم مشکل چیه چون من متاسفانه کدتون به طور کامل نگاه نکردم ولی چون میگید باید یه بار از اکتیویتی خارج بشی تا موارد اعمال بشه و رفرش شه..پس
دوست عزیز شما میتونید واسه این حالت .روشهای زیادی  داشته باشید.چون من ساختار کد شما رو ندیدم نمیتونم  بهترین روش بگم چیه..ولی روشی که معمولا جواب میده..اینه که بعد ازاتمام دانلود و ذخیره آن در دیتابیس کافی تابع رفرش رو صدا بزنید..

کد پی‌اچ‌پی:
public void refresh()
{
Intent refresh=new Intent(khanevadeh.this,khanevadeh.class);
StartActivity(refresh);


این تابع میاد یکبار دیگه خود اکتیوتی دوباره صدا میزنه..اینکار باعث میشه متد OnCreate دوباره از نوع آغاز به کار بشه ..و دیگه احتیاجی نباشه از اکتیویتی خارج و دوباره وارد بشید..
پاسخ
 سپاس شده توسط admin

رفرش کردن گریدویو بعد از انجام اپدیت

#5
ممنون بهروز جان، برای پارت اول پیشنهادت اینه که قابلیت کنسل رو بردارم یا ...؟

برای پارت دوم هم اومدم از runOnUiThread استفاده کردم در اسینک تسک و مشکل حل شد. کدش رو میزارم اگه کس دیگه ای به مشکل خورد بتونه استفاده کنه :

در فرگمنت :
کد پی‌اچ‌پی:
protected void onPostExecute(JSONObject result) {
                
pDialog.dismiss();

                
getActivity().runOnUiThread(new Runnable() {
                    public 
void run() {

                        
                        
int save db.shgoroh("zibae");
                        
Goroh = new String [save];

                        
                        for (
int i 0<savei++) {
                            
                            
Goroh[i]= db.ngoroh("zibae"i1);

                            }
                        
                        
                        
CustomGrid adapter = new CustomGrid(getActivity(), GorohimageId);
                        
grid.setAdapter(adapter);
                        
                        
                    }
                });
                
                
            } 
 
پاسخ

رفرش کردن گریدویو بعد از انجام اپدیت

#6
به نظرم نه .در این صورت اگه سرور شما به مشکل بخوره و ..شخص نمیتونه دکمه بک گوشی بزنه و از پروگرس بار بیاد بیرون،..که این کار که کاربر توی یک محیط پروگرس بار نگهش داری به زور ،زیاد جالب نیست ، پس قابلیت کنسل باشه،ولی میتونید کنترلش کنید با موارد دیگه ای.
پاسخ
 سپاس شده توسط parniaznet

رفرش کردن گریدویو بعد از انجام اپدیت

#7
بهروز جان ازین موارد دیگه ای که گفتید چند روش رو نام میبرید که من مطالعه کنم؟
پاسخ
 سپاس شده توسط شماره مجازی امارات


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان