آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

دانلود تصاویر فقط آیتم هایی که در حال نمایش هستند، در لیست

hosseinAmini  12 سال پیش  12 سال پیش
+1 0

سلام 

فرض کنید یه لیست داریم که ۲۰۰تا آیتم داره و هر آیتم یه عکس داره که این عکس ها از سرور دانلود می شن. تو حالت عادی اگر کاربر اسکرول کنه و به انتهای لیست برسه تمامی ۲۰۰تا عکس در یک لحظه از سرور دانلود میشن که اینکار باعث میشه برنامه تا دانلودها تموم شه یکم کند بشه. 

حالا من یه برنامه دیدم که فقط تصاویر آیتم هایی رو که تو صفحه در حال نمایش  هستند رو از سرور می گرفت. مثلا اگر گوشی در یک لحظه می تونست ۱۰تا آیتم رو نشون بده، اگر کاربر سریع اسکرول میکرد و به انتهای لیست می رسید به جای اینکه تصاویر آیتم ۱ تا ۲۰۰ رو با هم دانلود کنه فقط برای آیتم های ۱۹۰ تا ۲۰۰ رو دانلود میکرد.

چه جوری میشه این کار رو کرد؟ بچه لطفا هر روشی به ذهنتون میرسه بگید که یه سر نخ دستم بیاد.

تشکر

0 0
عکسهای 10 آیتم آخری که fill شدن (با یه استک) رو با چند ثانیه تاخیر شروع به دانلود کن - تاخیر برای اسکرول های شدیده! (12 سال پیش)
0 0
میشه یکم بیشتر توضیح بدید؟ اگر من توی متد fill در adapter از Thread برای تاخیر استفاده کنم که بعد از زمان خاصی اطلاعات رو برای دانلود کردن ارسال کنه درست میشه؟ من استک رو نمی دونم چیه، میشه توضیح بدید؟ (12 سال پیش)
 برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال 
محمد حسین زاده  12 سال پیش
+2 0

خیر اگه تو متد fill اینکار رو بکنی باز هم همون داستانه - فرقی نداره

استک درست میکنی 10 تایی - یعنی اگه آیتم 11 اومد آیتم 1 حذف میشه

 setOnScrollListener(new OnScrollListener(){
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
if(scrollState == 0) Log.i("a", "scrolling stopped...");
}
});
}

وقفه اسکرول رو پیدا میکنی

استک رو میفرستی برای دانلود

0 0
محمد آقا شما خودت خیلی بلدی بعد فکر می کنید که همه مثل خودتونن :))) من از این کد هیچی متوجه نشدم ، این کد رو باید تو کلاس خاصی استفاده کنم؟ کارش چیه؟ اولین چیزی که باید یاد بگیرم اینه که بفهمم استک چیه و چه جوری استفاده میشه که دارم تو کوکل می کردم. شما هم اکر زحمتی نیست، اکر مقاله خوب سراغ دارید بگید و برای یادگیری کمکم کنید، چون با این سطح علم من فکر می کنم پیاده سازیش ممکن نباشه و باید چیزای جدید یاد بگیرم. ممنون (12 سال پیش)
0 0
نه چیزی لازم نیست یاد بگیری - استک رو ولش کن ! یه آرایه داری که 10 آیتم آخر fill شده رو توش داری - اون متد هم یه لیسنر برای لیست ویوس - مثل لیسنری که برای button میذاری (12 سال پیش)
0 0
پس یه آرایه می سازم که 10 تا عنصر میشه توش قرار داد. وقتی اسکرول میشه 10 تا آتیم آخر رو باید بریزم تو این آرایه. پس این کار رو باید تو متد fill انجام بدم دیگه؟ این لیسنر برای لیست ویو که دادید، چی کار باید کنم باهاشون؟ (12 سال پیش)
0 0
اون آرایه رو که ساختی پس 10 تا آخری رو داری - این لیسنر بهت کمک میکنه زمانی پردازش لیت رو شروع کنی که اسکرول کردن لیست ویو متوقف شده باشه (12 سال پیش)
0 0
واقعا ممنونم ازتو ن تقریبا فهمی دم چی شد. تا تست نکنم همینجوری سوال میاد تو ذهنم :) برم تست کنم اگه مشکل داشتم، مطرح می کنم (12 سال پیش)
پاسخ به سوال 
hosseinAmini  12 سال پیش
0 0

آقا من ده تا تصویر آخر رو به روش زیر گرفتم:
یه فیلد توی کلاس G ساختم به اسم counter و یک آرایه هم از جنس  StructImage ساختم :

  public static int                      counter       = 0;
public static StructImage[] lastItems = new StructImage[10];

بعد تو متد fill کلاس adapter این کار رو کردم 

 if (G.counter == 10) {
                G.counter = 0;
            }
            G.lastItems[G.counter] = item;
            G.counter++;

حالا باید چی کار کنم؟

0 0
حالا با اون لیسنر میتونی دانلود تصاویر رو شروع کنی (12 سال پیش)
پاسخ به سوال 
hosseinAmini  12 سال پیش
0 0

من این یه تیکشو متوجه نمی شم. چه جوری با اون لیسنر 10تا تصویر دا خل آرایه رو بفرستم برای دانلود؟ آخه من تصاویر رو توی adapter چک می کردم بعد اگر توی دایرکتوری نبود تصویر می فرستمش برای دانلود اگر هم بود که نمایشش میدم (مثل آموزش استاد) کد متده fill کلاسAdapterImages 

 public void fill(ArrayAdapter<StructImage> adapter, final StructImage item, int position) {

            if (G.counter == 10) {
                G.counter = 0;
            }
            G.lastItems[G.counter] = item;
            G.counter++;
            
            imageName = HelperString.getFileName(item.url);

            File thumbFile = new File(G.DIR_THUMBNAIL + "/" + imageName);
            if ( !thumbFile.exists()) {
                imgThumb.setImageBitmap(null);
                DownloadManager.addToDownloadList(imgThumb, item.url, item.sImageId);
            }
            Bitmap bitmap = BitmapFactory.decodeFile(thumbFile.getAbsolutePath());
            imgThumb.setImageBitmap(bitmap);

            imgThumb.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    if (CheckInternet.isOnline()) {
                        Intent intent = new Intent(G.currentFragment, ActivityShare.class);
                        intent.putExtra("IMAGE_NAME", imageName);
                        G.currentFragment.startActivity(intent);
                    } else {
                        File imageFile = new File(G.DIR_IMAGES + "/" + imageName);
                        if ( !imageFile.exists()) {

                            Toast toast = new Toast(G.context);
                            toast.setDuration(Toast.LENGTH_LONG);
                            toast.setView(toastLayout);
                            toast.show();
                        } else {
                            Intent intent = new Intent(G.currentFragment, ActivityShare.class);
                            intent.putExtra("IMAGE_NAME", imageName);
                            G.currentFragment.startActivity(intent);
                        }
                    }
                }
            });

        }
    }
پاسخ به سوال 
hosseinAmini  12 سال پیش
0 0

بچه ها من تونستم این کا رو انجام بدم ولی گالری رو به روشی که adapter رو public می کردیم باید درست کنیم ( روشی که استاد گفت غیر استاندارده). روشم اینجوریه:
1- تو کلاس G یه آرایه 10تایی از جنس StructImage می سازیم و یک متغیر از جنس int :

 public static StructImage[]            lastItems     = new StructImage[10];
    public static int                      counter       = 0;

متد fill کلاس AdapterImage 

 public void fill(ArrayAdapter<StructImage> adapter, final StructImage item, int position) {

            if (G.counter == 10) {
                G.counter = 0;
            }
            Log.i("TAG", "counter = " + G.counter);
            G.lastItems[G.counter] = item;
           
            imageName = HelperString.getFileName(G.lastItems[G.counter].url);

            G.counter++;

            File thumbFile = new File(G.DIR_THUMBNAIL + "/" + imageName);
           
            imgThumb.setImageBitmap(null);
            if (thumbFile.exists()) {
                Bitmap bitmap = BitmapFactory.decodeFile(thumbFile.getAbsolutePath());
                imgThumb.setImageBitmap(bitmap);
            }

            imgThumb.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    if (CheckInternet.isOnline()) {
                        Intent intent = new Intent(G.currentFragment, ActivityShare.class);
                        intent.putExtra("IMAGE_NAME", imageName);
                        G.currentFragment.startActivity(intent);
                    } else {
                        File imageFile = new File(G.DIR_IMAGES + "/" + imageName);
                        if ( !imageFile.exists()) {

                            Toast toast = new Toast(G.context);
                            toast.setDuration(Toast.LENGTH_LONG);
                            toast.setView(toastLayout);
                            toast.show();
                        } else {
                            Intent intent = new Intent(G.currentFragment, ActivityShare.class);
                            intent.putExtra("IMAGE_NAME", imageName);
                            G.currentFragment.startActivity(intent);
                        }
                    }
                }
            });

        }
    }

در FragmentNewImages که می خوام تصاویر رو دانلود کنم

 public static AdapterImages    adapter;
    private ArrayList<StructImage> imagesAll = new ArrayList<StructImage>();


    public FragmentNewImages() {}


    @Override
    public void onResume() {
        super.onResume();
        G.currentFragment = getSherlockActivity();
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_new_images, container, false);

        GridView gridAllImages = (GridView) view.findViewById(R.id.gridAllImages);
        adapter = new AdapterImages(imagesAll);
        gridAllImages.setAdapter(adapter);
        gridAllImages.setOnScrollListener(new OnScrollListener() {

            @Override
            public void onScrollStateChanged(final AbsListView view, final int scrollState) {
                G.HANDLER.postDelayed(new Runnable() {

                    @Override
                    public void run() {

                        if (scrollState == 0) {
                            for (int i = 0; i < 10; i++) {

                                String imageName = HelperString.getFileName(G.lastItems[i].url);
                                File thumbFile = new File(G.DIR_THUMBNAIL + "/" + imageName);
                                if ( !thumbFile.exists()) {
                                    DownloadManager.addToDownloadList(G.lastItems[i].url);
                                }
                                if (thumbFile.exists()) {
                                    Bitmap bitmap = BitmapFactory.decodeFile(thumbFile.getAbsolutePath());
                                }
                                Log.i("TAG", "scrolling stopped...");
                            }
                        }
                    }
                }, 5000);
            }


            @Override
            public void onScroll(AbsListView view, int arg, int arg2, int scrollState) {}
        });

        imagesAll.clear();
            getImageFromInternet();
        return view;
    }


    private void getImageFromInternet() {
        Thread thread = new Thread(new Runnable() {

            @Override
            public void run() {
                //imagesAll.clear();
                ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("action", "all"));
                String result = Webservice.readUrl("http://www.hossein-amini.ir/androidProject/webservice.php", params);
                try {
                    JSONArray images = new JSONArray(result);
                    for (int i = 0; i < images.length(); i++) {
                        StructImage image = new StructImage();
                        JSONObject object = images.getJSONObject(i);
                        image.url = object.getString("image_name");
                        image.sImageId = object.getInt("image_id");

                        imagesAll.add(image);
                    }
                    G.HANDLER.post(new Runnable() {

                        @Override
                        public void run() {
                            adapter.notifyDataSetChanged();
                        }
                    });

                }
                catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    }

 

در روش HashMap که استاد یاد داد، با هر بار صدا کردن متده addToDownload، یه ImageView هم ارسال می کردیم خب چون متده addToDownload رو توی AdapterImage صدا می زدیم اینکار رو میشد انجام داد ولی الان که متده addToDownload رو توی FragmentNewImages صدا می زنیم چه جوری باید براش ImageView ارسال کرد؟


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .