Reputation: 6899
I am using view pager to swipe images. I can get url in Log but when I try to set in ImageView I am getting error as.
E/AndroidRuntime(1895): FATAL EXCEPTION: main
E/AndroidRuntime(1895): Process: com.project.center, PID: 1895
E/AndroidRuntime(1895): java.lang.NullPointerException: Attempt to read from field com.project.center.views.TouchImageView com.project.center.FullScreenActivity$ViewHolder.mImageView' on a null object reference
E/AndroidRuntime(1895): at com.project.center.FullScreenActivity$ViewPagerAdapter.instantiateItem(FullScreenActivity.java:82)
: E/AndroidRuntime(1895): at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110)
E/AndroidRuntime(1895): at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:837)
E/AndroidRuntime(1895): at android.support.v4.view.ViewPager.populate(ViewPager.java:987)
E/AndroidRuntime(1895): at android.support.v4.view.ViewPager.populate(ViewPager.java:919)
E/AndroidRuntime(1895): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441)
E/AndroidRuntime(1895): at android.view.View.measure(View.java:17430)
E/AndroidRuntime(1895): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
: E/AndroidRuntime(1895): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
E/AndroidRuntime(1895): at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
E/AndroidRuntime(1895): at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
E/AndroidRuntime(1895): at android.view.View.measure(View.java:17430)
E/AndroidRuntime(1895): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
E/AndroidRuntime(1895): at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
E/AndroidRuntime(1895): at android.view.View.measure(View.java:17430)
E/AndroidRuntime(1895): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
E/AndroidRuntime(1895): at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:447)
E/AndroidRuntime(1895): at android.view.View.measure(View.java:17430)
E/AndroidRuntime(1895): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
E/AndroidRuntime(1895): at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
I checked many times in code but I couldn't solve the error.
public class FullScreenActivity extends Activity {
private ViewPager viewPager;
ViewPagerAdapter viewpageradapter;
ArrayList<String> imageUrl;
private Intent mIntent;
private int imagePosition;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.image_viewpager);
mIntent = getIntent();
imageUrl = mIntent.getStringArrayListExtra("url");
imagePosition = mIntent.getIntExtra("imageurl", 0);
viewPager = (ViewPager) findViewById(R.id.myfivepanelpager);
viewpageradapter = new ViewPagerAdapter(this, imageUrl);
viewPager.setAdapter(viewpageradapter);
}
class ViewPagerAdapter extends PagerAdapter {
Activity activity;
ArrayList<String> imgArray;
public ImageLoader imageLoader;
ViewHolder viewHolder;
public ViewPagerAdapter(Activity act, ArrayList<String> imgArra) {
imgArray = imgArra;
activity = act;
imageLoader = new ImageLoader(act);
aquery = new AQuery(act);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return imgArray.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == ((View) arg1);
}
public Object instantiateItem(View convertView, int position) {
LayoutInflater layoutinflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = layoutinflater.inflate(
R.layout.image_viewpager_row, null);
viewHolder.mImageView = (TouchImageView) convertView
.findViewById(R.id.imageViews);
convertView.setTag(viewHolder);
} else
viewHolder = (ViewHolder) convertView.getTag();
String imgUrl = imgArray.get(position);
Log.e("imgUrl",imgUrl); // i can get image url here.
imageLoader.DisplayImage(imgUrl, viewHolder.mImageView);
return convertView;
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView((View) arg2);
}
@Override
public Parcelable saveState() {
return null;
}
}
static class ViewHolder {
public TouchImageView mImageView;
}
}
Here is viewpager xml:
<android.support.v4.view.ViewPager
android:id="@+id/myfivepanelpager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
and image_viewpager.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.project.center.TouchImageView
android:id="@+id/imageViews"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/ic_launcher" />
</LinearLayout>
Please help me to solve the issue.
Upvotes: 2
Views: 2721
Reputation: 47807
try to change your instantiateItem
code like
public Object instantiateItem(View container2, int position) {
LayoutInflater layoutinflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View ve = layoutinflater.inflate(R.layout.image_viewpager_row, null);
TouchImageView mImageView = (TouchImageView) ve.findViewById(R.id.imageViews);
String imgUrl = imgArray.get(position);
Log.e("imgUrl",imgUrl); // i can get image url here.
imageLoader.DisplayImage(imgUrl, mImageView);
((ViewPager) container2).addView(ve, 0);
return ve;
}
There is no need to used ViewHolder
over here.
Upvotes: 2
Reputation: 132972
No need to use ViewHolder
class and setTag
and getTag
methods. modify instantiateItem
method as to add view to current selected screen:
public Object instantiateItem(View container2, int position) {
LayoutInflater layoutinflater = (LayoutInflater)
activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View ve=layoutinflater.inflate(R.layout.image_viewpager_row, null);
TouchImageView mImageView = (TouchImageView)ve.findViewById(R.id.imageViews);
String imgUrl = imgArray.get(position);
Log.e("imgUrl",imgUrl); // i can get image url here.
imageLoader.DisplayImage(imgUrl, mImageView);
((ViewPager) container2).addView(ve, 0);
return ve;
}
Upvotes: 1
Reputation: 15379
The first parameter to instantiateItem
is a ViewGroup container, not a convertView. You cannot use the convertView/viewHolder recycling pattern directly from the PagerAdapter. You will need to rewrite that code.
I recommend to use this ViewPagerAdapter to help you do this.
Upvotes: 1