Yaseen Ahmad
Yaseen Ahmad

Reputation: 1797

why my images not load with Picasso library in view pager?

Hi developers i'm trying to load images in view pager using Picasso library but everything it's return me empty view pager don't what happens to my code

This is my Fragment code

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

    Bundle bundle = this.getArguments();
    String id = bundle.getString("id");

    dish_images_array = new ArrayList<>();
    new get_dishes_details_data().execute(getString(R.string.dish_details)+id);

    pager = (ViewPager)v.findViewById(R.id.img_slider);
    pager.setAdapter(new slider_images(getActivity(), dish_images_array));
    return v;
}

this is my slider_images.java adapter code

package com.example.yasee.bitescene.adapter;

import android.app.Activity;
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;

import com.example.yasee.bitescene.R;
import com.squareup.picasso.Picasso;
import java.util.List;

public class slider_images extends PagerAdapter {
    Context c;
    private List<String> _imagePaths;
    private LayoutInflater inflater;
    ImageView imgDisplay;

public slider_images(Activity c, List<String> imagePaths) {
    this._imagePaths = imagePaths;
    this.c = c;
}

@Override
public int getCount() {
    return this._imagePaths.size();
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return view == (object);
}

@Override
public Object instantiateItem(ViewGroup container, int position) {


    inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View viewLayout = inflater.inflate(R.layout.slider, container, false);
    imgDisplay = (ImageView) viewLayout.findViewById(R.id.slider_image);
    Picasso.with(c).load(_imagePaths.get(position)).into(imgDisplay);
    (container).addView(viewLayout);

    return viewLayout;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    (container).removeView((RelativeLayout) object);
}
}

this is my error

06-20 05:12:05.095 3280-3280/com.example.yasee.bitescene E/InputEventReceiver: Exception dispatching input event. 06-20 05:12:05.095 3280-3280/com.example.yasee.bitescene E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback 06-20 05:12:05.115 3280-3280/com.example.yasee.bitescene E/MessageQueue-JNI: java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 0, found: 3 Pager id: com.example.yasee.bitescene:id/img_slider Pager class: class android.support.v4.view.ViewPager Problematic adapter: class com.example.yasee.bitescene.adapter.slider_images at android.support.v4.view.ViewPager.populate(ViewPager.java:1071) at android.support.v4.view.ViewPager.populate(ViewPager.java:1025) at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2114) at android.view.View.dispatchTouchEvent(View.java:7706) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068) at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515) at android.app.Activity.dispatchTouchEvent(Activity.java:2458) at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60) at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016) at android.view.View.dispatchPointerEvent(View.java:7886) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3954) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3833) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418) at android.view.ViewRootImpl$InputStage.apply(View 06-20 05:12:05.125 3280-3280/com.example.yasee.bitescene E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.yasee.bitescene, PID: 3280 java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 0, found: 3 Pager id: com.example.yasee.bitescene:id/img_slider Pager class: class android.support.v4.view.ViewPager Problematic adapter: class com.example.yasee.bitescene.adapter.slider_images

The above error in android monitor when i try to slide images..

and this is my result.

enter image description here

this is my AsyncTask task code

private class get_dishes_details_data extends AsyncTask<String, Void, Boolean> {
    ProgressDialog dialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog(getActivity());
        dialog.setMessage("Loading... please wait");
        dialog.show();
        dialog.setCancelable(false);
    }


    @Override
    protected Boolean doInBackground(String... urls) {
        try {
            HttpGet httppost = new HttpGet(urls[0]);
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response = httpclient.execute(httppost);

            // StatusLine stat = response.getStatusLine();
            int status = response.getStatusLine().getStatusCode();

            if (status == 200) {
                HttpEntity entity = response.getEntity();
                String data = EntityUtils.toString(entity);


                JSONObject jsono = new JSONObject(data);
                JSONArray jarray = jsono.getJSONArray("dish_details");

                for (int i = 0; i < jarray.length(); i++) {
                    JSONObject jsonrealobject = jarray.getJSONObject(i);
                    dishname = jsonrealobject.getString("dish_name");
                    restaurantname = jsonrealobject.getString("name");
                    businesses_id = jsonrealobject.getString("businesses_id");
                }
                JSONArray imagesarry = jsono.getJSONArray("dish_images");
                for (int i = 0; i < imagesarry.length(); i++){
                    JSONObject jobject = imagesarry.getJSONObject(i);
                    String image = jobject.getString("dish_image");
                    dish_images_array.add(image);
                }
                return true;
            }

        } catch (ParseException | IOException | JSONException e1) {
            e1.printStackTrace();
        }
        return false;
    }
    protected void onPostExecute(Boolean result) {
        dialog.cancel();
        textView_dish_name = (TextView)getActivity().findViewById(R.id.textView_dish_name);
        textView_dish_name.setText(dishname);
        textView_dish_name.setTypeface(custom_font);

        restaurent_name = (TextView)getActivity().findViewById(R.id.restaurent_name);
        restaurent_name.setText(restaurantname);
        restaurent_name.setTypeface(custom_font);

        yelp_id = (TextView)getActivity().findViewById(R.id.yelp_id);
        yelp_id.setText("Link To The Restaurant: https://www.yelp.com/biz/"+businesses_id);
        yelp_id.setTypeface(custom_font);
        if(result == false){
            Toast.makeText(getActivity(), "Unable to fetch data from server", Toast.LENGTH_LONG).show();
        }
    }
}

Upvotes: 0

Views: 1382

Answers (3)

PriyankaChauhan
PriyankaChauhan

Reputation: 953

if your notifyDataSetChanged() is not working you can re-initialize the adapter

pager.setAdapter(new slider_images(getActivity(), dish_images_array));

Upvotes: 0

Neo
Neo

Reputation: 3584

The problem is nothing to do with Picasso. As per your logs I think you are updating the arryalist but not calling notifyDataSetChanged().

PagerAdapter#notifyDataSetChanged! Expected adapter item count: 0, found: 3 

Now as per your code, my suggestion is to change few lines -

        slider_images sliderImagesAdapter; // At class level

        pager = (ViewPager)v.findViewById(R.id.img_slider);
        sliderImagesAdapter = new slider_images(getActivity(), dish_images_array)
        pager.setAdapter(sliderImagesAdapter);

Here make an class level variable for slider_images. and in onPostExecute, do this,

    if(result)
      sliderImagesAdapter.notifyDataSetChanged();

Call notifyDataSetChanged() every-time you making any change(add/remove) in list provided to any adapter.

Hope it will help you :)

Upvotes: 0

Shree Krishna
Shree Krishna

Reputation: 8562

Expected adapter item count: 0, found: 3 means you've set the adapter too earlier than the items of page and it's clearly saying that you didn't call pageAdapter.notifyDataSetChanged().

I suggest having a look at this format of PagerAdapter and make yours as similar. See where notifyDataSetChanged() has been called there.

Upvotes: 0

Related Questions