2015-09-11 1 views
0

Я разрабатываю приложение для Android, чтобы показывать изображения в сетке. Я следую шагам, перечисленным в youtube tutorial. При запуске приложения метод getview встречает исключение NullpointerException. Я не могу понять причину этого исключения. Можете ли вы помочь мне выяснить, что не так? Исключением являетсяNullPointerException при использовании setBackgroundResource()

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setBackgroundResource(int)' on a null object reference 

activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:layout_height="match_parent" tools:context=".MainActivity" android:id="@+id/container"> 

<GridView 
android:id="@+id/grid_view" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:columnWidth="80dp" 
android:horizontalSpacing="10dp" 
android:numColumns="auto_fit" 
android:stretchMode="columnWidth" 
android:verticalSpacing="10dp"> 

</GridView> 

<ImageView 
    android:id="@+id/expanded_image" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:contentDescription="@string/app_name" 
    android:visibility="invisible" 
    /> 
</FrameLayout> 

single_grid_item.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:padding="5dp"> 

<ImageView 
    android:id="@+id/thumb" 
    android:layout_width="72dp" 
    android:layout_height="72dp" 
    android:layout_gravity="center_horizontal" 
    android:contentDescription="@string/app_name"/> 
</LinearLayout> 

MainActivity.Java

public class MainActivity extends Activity { 

private GridView gv; 
private Animator mCurrentAnimator; 
private int mShortAnimationDuration; 
private int j=0; 

private GestureDetector detector; 
private static final int SWIPE_MIN_DISTANCE=120; 
private static final int SWIPE_THRESHOLD_VELOCITY=200; 

private int thumb[] = { 
     R.drawable.chrysanthemum,R.drawable.desert, R.drawable.hydrangeas, R.drawable.jellyfish, R.drawable.koala, R.drawable.lighthouse, R.drawable.penguins, R.drawable.tulips 
}; 

private ImageView expandedImageView; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    detector = new GestureDetector(this, new SwipeGestureDetector()); 

    gv = (GridView) findViewById(R.id.grid_view); 
    gv.setAdapter(new ImageAdapter(this)); 
    gv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View v, int pos, long id) { 

      j = pos; 
      zoomImageFromThumb(v, thumb[pos]); 

     } 
    }); 

    mShortAnimationDuration = getResources().getInteger(android.R.integer.config_shortAnimTime); 

} 

class ImageAdapter extends BaseAdapter { 

    private LayoutInflater layoutInflater; 

    public ImageAdapter(MainActivity activity){ 
     layoutInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     return thumb.length; 
    } 

    @Override 
    public Object getItem(int pos) { 
     return pos; 
    } 

    @Override 
    public long getItemId(int pos) { 
     return pos; 
    } 

    @Override 
    public View getView(int pos, View convertView, ViewGroup parent) { 

     View listItem = convertView; 
     int p = pos; 

     if(listItem == null) { 
      Log.d("Debug","1"); 
      listItem = layoutInflater.inflate(R.layout.single_grid_item, null); 
     } 
     Log.d("Debug","2"); 
     ImageView iv = (ImageView) findViewById(R.id.thumb); 
     Log.d("Debug","3"); 

     iv.setBackgroundResource(thumb[p]); 
     Log.d("Debug", "4"); 
     return listItem; 
    } 
} 

private void zoomImageFromThumb(final View thumbView, int imageResId) { 
    if(mCurrentAnimator != null){ 
     mCurrentAnimator.cancel(); 
    } 

    expandedImageView = (ImageView) findViewById(R.id.expanded_image); 

    expandedImageView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (detector.onTouchEvent(event)) { 
       return true; 
      } else { 
       return false; 
      } 

     } 
    }); 

    expandedImageView.setImageResource(imageResId); 

    final Rect startBounds = new Rect(); 
    final Rect finalBounds = new Rect(); 
    final Point globalOffSet = new Point(); 

    thumbView.getGlobalVisibleRect(startBounds); 
    findViewById(R.id.container).getGlobalVisibleRect(finalBounds, globalOffSet); 

    startBounds.offset(-globalOffSet.x, globalOffSet.y); 
    finalBounds.offset(-globalOffSet.x, globalOffSet.y); 

    float startScale; 

    if((float) finalBounds.width()/finalBounds.height() > startBounds.width()/startBounds.height()) { 

     startScale = (float) startBounds.height()/finalBounds.height(); 
     float startWidth = startScale * finalBounds.width(); 
     float deltaWidth = (startWidth - startBounds.width())/2; 
     startBounds.left -= deltaWidth; 
     startBounds.right += deltaWidth; 

    }else { 

     startScale = (float) startBounds.width()/finalBounds.width(); 
     float startHeight = startScale * finalBounds.height(); 
     float deltaHeight = (startHeight - startBounds.height())/2; 
     startBounds.top -= deltaHeight; 
     startBounds.bottom += deltaHeight; 

    } 

    thumbView.setAlpha(0f); 
    expandedImageView.setVisibility(View.VISIBLE); 

    expandedImageView.setPivotX(0f); 
    expandedImageView.setPivotY(0f); 

    AnimatorSet set = new AnimatorSet(); 

    set.play(ObjectAnimator.ofFloat(expandedImageView, View.X, startBounds.left, finalBounds.left)).with(ObjectAnimator.ofFloat(expandedImageView, View.Y, startBounds.top, finalBounds.top)).with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_X, startScale, 1f)).with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_Y, startScale, 1f)); 

    set.setDuration(mShortAnimationDuration); 
    set.setInterpolator(new DecelerateInterpolator()); 
    set.addListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      mCurrentAnimator = null; 
     } 

     @Override 
     public void onAnimationCancel(Animator animation) { 
      mCurrentAnimator = null; 
     } 
    }); 

    set.start(); 
    mCurrentAnimator = set; 

    final float startScaleFinal = startScale; 
    expandedImageView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(mCurrentAnimator != null){ 
       mCurrentAnimator.cancel(); 
      } 
      AnimatorSet set = new AnimatorSet(); 

      set.play(ObjectAnimator.ofFloat(expandedImageView, View.X, startBounds.left)) 
        .with(ObjectAnimator.ofFloat(expandedImageView, View.Y, startBounds.top)) 
        .with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_X, startScaleFinal)) 
        .with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_Y, startScaleFinal)); 



      set.setDuration(mShortAnimationDuration); 
      set.setInterpolator(new DecelerateInterpolator()); 
      set.addListener(new AnimatorListenerAdapter() { 
       @Override 
       public void onAnimationEnd(Animator animation) { 
        thumbView.setAlpha(1f); 
        expandedImageView.setVisibility(View.GONE); 
        mCurrentAnimator = null; 
       } 

       @Override 
       public void onAnimationCancel(Animator animation) { 
        thumbView.setAlpha(1f); 
        expandedImageView.setVisibility(View.GONE); 
        mCurrentAnimator = null; 
       } 
      }); 

      set.start(); 
      mCurrentAnimator = set; 
     } 
    }); 

} 

private class SwipeGestureDetector extends GestureDetector.SimpleOnGestureListener { 
@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
    try{ 

     if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY){ 
      if(thumb.length > j) { 
       j++; 

       if(j < thumb.length) { 
        expandedImageView.setImageResource(thumb[j]); 
        return true; 
       } else { 
        j = 0; 
        expandedImageView.setImageResource(thumb[j]); 
        return true; 
       } 

      } 
     } else if(e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY){ 

      if(j >0) { 
       j--; 
       expandedImageView.setImageResource(thumb[j]); 
       return true; 
      } else { 
       j= thumb.length-1; 
       expandedImageView.setImageResource(thumb[j]); 
       return true; 
      } 
     } 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 


    return false; 
} 
} 
} 
+0

можно попробовать заменить ** ImageView IV = (ImageView) findViewById (R.id.thumb) **; по ImageView iv = (ImageView) listItem.findViewById (R.id.thumb); – Nischal

ответ

1

Заменить
ImageView iv = (ImageView)findViewById(R.id.thumb);

с

ImageView iv = (ImageView)listItem.findViewById(R.id.thumb); 

, потому что ваш listItem вид содержит ссылки на макете single_grid_item

+0

Большое спасибо, это сработало –

 Смежные вопросы

  • Нет связанных вопросов^_^