مشکل در، سِت کردن آدرس تصاویر دریافت شده از جیسون روی ViewPager
سلام. من با ViewPager یه اسلایدر تصویر درست کردم که بصورت خودکار اسلاید شو هست. مشکلم این هست که آدرس تصاویر رو از سرور با جیسون گرفتم. اون آدرس ها رو ذخیره کردم توی آرایه(دقیقا مثل لیست ویو). حالا میخوام اون آدرس ها رو بخونم و با کتابخانه UnivarsalImageLoader توی اسلایدرم نشونش بدم. الان کدی که مینویسم واسه دریافت آدرس عکس، خطا میگیره و اصلا توی ViewPager ورودی item نداریم مثل لیست ویو. و مثلا نمیشه اینجوری به مقادیر داخل آرایه دسترسی داشته باشم:
String url = item.cat_img_url;
این کد واسه ViewPager هست:
public class AdapterViewPager extends PagerAdapter { public ArrayList<Information> imageIdis; public AdapterViewPager(ArrayList<Information> imageIdis){ this.imageIdis = imageIdis; } @Override public int getCount() { return imageIdis.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view.equals(object); } @Override public Object instantiateItem(final ViewGroup container, int position) { final View view = G.inflater.inflate(R.layout.adapter_gallery, null); ImageView image = (ImageView) view.findViewById(R.id.imgSlider); ImageLoader imageLoader = ImageLoader.getInstance(); DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.ic_launcher) // نمایش تصویر پیش فرض هنگام لود کرن تصویر .showImageForEmptyUri(R.drawable.ic_launcher) // نمایش تصویر پیش فرض در صورتی که در یافت تصویر با مشکل روبرو شده .resetViewBeforeLoading(false) .cacheOnDisk(true) .delayBeforeLoading(0) .build(); String url = imageIdis.get(position).image_url; Log.i("LOG", "URL_IMAGE_UNIVERSAL: " + url); imageLoader.displayImage(url, image, options); Handler refresh = new Handler(Looper.getMainLooper()); refresh.post(new Runnable() { public void run() { container.addView(view); } }); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } }
اینم کد دریافت جیسون:
private void readData() { //Read URL For Receive Json Code String result = Webservice.readUrl(url); Log.i("LOG", "URLRESULT: "+ result); if (result != null) { try { imageIdis.clear(); JSONArray jsonurl = new JSONArray(result); for (int i = 0; i < jsonurl.length(); i++) { JSONObject object = jsonurl.getJSONObject(i); Information url = new Information(); String img_url = object.getString("a_pic"); url.image_url = (G.ip + "images/" + img_url); url.a_id = object.getInt("aid"); url.p_uid = object.getInt("p_uid"); url.a_name = object.getString("a_name"); url.a_title = object.getString("a_title"); url.a_title = object.getString("a_title"); imageIdis.add(url); } } catch (JSONException e) { e.printStackTrace(); } } adapterPager.notifyDataSetChanged(); }
این کد رو هم برای اسلاید شو کردن ویوپیجر نوشتم که خودکار اسلایدها رو جابجا کنه:
Timer timer; int page = 0; public void pageSwitcher(int seconds) { timer = new Timer(); // At this line a new Thread will be created timer.scheduleAtFixedRate(new RemindTask(), 0, seconds * 1000); // delay // in // milliseconds } // this is an inner class... class RemindTask extends TimerTask { @Override public void run() { // As the TimerTask run on a seprate thread from UI thread we have // to call runOnUiThread to do work on UI thread. runOnUiThread(new Runnable() { public void run() { if (page >= imageIdis.size()) { // In my case the number of pages are 5 page = 0; } else { viewPager.setCurrentItem(page++); } } }); } }
اگه لطف کنید راهنمایی کنید ممنون میشم.
مشکلی نیست، روش های پیاده سازی فرق داره، من چون کدم رو از آداپتر خودم برداشتم، به اون صورت پیاده سازی کرده بودم، شما چون یک بار از آیتم هاتون استفاده میکنید نیازی به اون کار ندارید. همینی که نوشتید درسته. اینکه گفتم یک آیتم رو بفرستید هم برای تمیز بودن برنامه و سبک اجرا شدن اونه. اینکه شما آدرس رو درست میگیرید ولی توی ویو پیجر درست نمایش نمیده بحثش جداست یک بار options رو حذف کنید و به صورت مستقیم عکس رو روی ImageView ست کنید ببینید درست میشه یا نه.
همونطور که گفتم، آدرس عکسارو درست دریافت می کنم. تا قبل از سِت کردنش به ImageView، هم لاگ میگیرم، درسته آدرسش.
وقتی کد زیر رو مینویسم، خطا نمیگیره و عکس هم نشون نمیده:
Handler refresh =newHandler(Looper.getMainLooper());
refresh.post(newRunnable(){publicvoid run(){ container.addView(view);}});
ولی وقتی اون کد container رو بدون Handler مینویسم، ازش خطا میگیره
اینم لاگش:
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .