Reputation: 1797
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.
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
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
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
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