2

Я использую view pager для прокрутки изображений. Я могу получить url в журнале, но когда я пытаюсь установить в ImageView, я получаю ошибку как.Как решить ссылку на нулевой объект в viewpager android

 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) 

Я проверил много раз в коде, но я не смог решить проблему.

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; 
} 

} 

Вот ViewPager XML:

<android.support.v4.view.ViewPager 
    android:id="@+id/myfivepanelpager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

</LinearLayout> 

и 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> 

Пожалуйста, помогите мне решить эту проблему.

ответ

2

попытаться изменить код instantiateItem как

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; 
} 

Там нет необходимости использоваться ViewHolder здесь.

+1

Где определяется преобразование? –

+0

Нет необходимости использовать вид здесь. –

1

Первым параметром для instantiateItem является контейнер ViewGroup, а не convertView. Вы не можете использовать шаблон переработки convertView/viewHolder непосредственно из PagerAdapter. Вам нужно будет переписать этот код.

Я рекомендую использовать этот ViewPagerAdapter, чтобы помочь вам в этом.

1

Не нужно использовать ViewHolder класс и setTag и getTag методы. изменить instantiateItem метод добавления вида на текущий выбранный экран:

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; 
}