2011-05-13 79 views
4

问题我试图在Gallery视图上创建一个预览效果,并且遇到了Gallery.getChildAt(int position)的问题,它大部分时间都返回null。它应该只在孩子没有显示时返回null,在这里不是这种情况,因为用户需要滚动它。有没有办法解决这个问题,还是应该改变我的方法?这里是我的代码:Gallery.getChildAt(int position)

gallery.setOnTouchListener(new OnTouchListener() { 

     @Override 
     public boolean onTouch(View view, MotionEvent event) { 
      if(event.getAction()==MotionEvent.ACTION_UP){ 
       preview_container.setVisibility(View.GONE); 
      } 
      else if(event.getDownTime()>2500){ 
       int position = gallery.pointToPosition((int)event.getX(), (int)event.getY()); 
       if (position!=AdapterView.INVALID_POSITION){ 
        View child = gallery.getChildAt(position); 
        if(child!=null){ 
         Bitmap tmp_bitmap = book.imageForPreview(position); 
         previewImg.setImageBitmap(tmp_bitmap); 
         FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(tmp_bitmap.getWidth()+2, tmp_bitmap.getHeight()+2,Gravity.NO_GRAVITY); 
         int[] coord = new int[2]; 
         child.getLocationOnScreen(coord); 
         int y = MMBookReader.this.getWindowManager().getDefaultDisplay().getHeight()-(tmp_bitmap.getHeight()+view.getHeight()); 
         int x = (int) coord[0]-(tmp_bitmap.getWidth()-child.getWidth())/2; 
         layout.leftMargin=x; 
         layout.topMargin=y; 
         preview_container.setVisibility(View.VISIBLE); 
         preview_container.setLayoutParams(layout); 
         previewPageCount.setText(book.getMmpages().get(position).getPosition()+"/"+book.getPages()); 
        } 
       } 
       else 
        preview_container.setVisibility(View.GONE); 
      } 
      return false; 
     } 
    }); 

编辑:我不是要填充库视图,我已经在这个部分完成,深知使用适配器类的。

编辑2:通过改变行解决:

View child = gallery.getChildAt(position); 

有:

View child = gallery.getChildAt(position - gallery.getFirstVisiblePosition()); 

回答

8

您的问题是,你假设position参数getChildAt需要和项目的在适配器的位置是相同的 - - 他们不是。

getChildAt位置是孩子的位置内它的父ViewGroup中,它无关,与你的适配器的位置 - 这是它运行从0getChildCount()-1

您可以将其与getFirstVisiblePosition()组合使用,它将返回您的适配器中第一项的位置,该位置是可见的。第一个可见视图也是其父项中的第一个子项,因此您为此项目传递给getChildAt的位置应为0

+0

非常感谢!!!!!!有效 !你真的救了我在这里。 :D – 2011-05-17 09:17:20

+0

谢谢你!为这一个搜索了很多... – Shirane85 2013-12-18 13:20:44

+0

这个作品很好〜!完善 – beginners 2014-02-18 04:52:55

0

你不能改变库项目(视图)这样的(据我所知)。 您应该更改图库适配器中此视图的数据并调用“notifyDataSetChange()”。在适配器的getView中,您可以根据数据更改视图的位图...(例如,您可以检查位图是否已加载,如果不使用资源中的默认图像...)

如果这不是你的意思,请澄清。什么适配器你们使用等实物......

祝你好运, JPM

+0

对于填充图库视图,我使用自定义适配器,扩展了我创建的基础适配器的类。我只是试图在用户滚动图库视图时显示用户手指放置的图像的更大预览。 – 2011-05-15 16:09:47

+1

好吧,在这种情况下,我会假设Gallery.getSelectedView()是你应该使用,而不是getChildAt ...? – jpm 2011-05-16 16:46:28