我正在尝试在Gallery视图上创建预览效果并遇到Gallery.getChildAt(int position)的问题,它在大多数时间返回null。它应该仅在未显示子项时返回null,这不是这里的情况,因为用户需要滚动它。有没有办法解决这个问题,还是应该改变我的做法?这是我的代码:
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;
}
});
编辑:我不是要填充Gallery视图,我已经完成了这部分,并且非常了解Adapter类的使用。
编辑2:通过更改行解决:
View child = gallery.getChildAt(position);
with:
View child = gallery.getChildAt( position - gallery.getFirstVisiblePosition() );
答案 0 :(得分:8)
您的问题是您假设position
参数getChildAt
占用且适配器中项目的位置相同 - 它们不是。
getChildAt
中的位置是孩子在其父ViewGroup中的位置,它与您的适配器位置无关 - 即它从0
运行到getChildCount()-1
。
您可以将此项与getFirstVisiblePosition()
结合使用,这将返回可见的第一项 项的位置。第一个可见视图也是其父级中的第一个子视图,因此您为此项目传递给getChildAt
的位置将为0
。
答案 1 :(得分:0)
您无法像这样更改图库项目(视图)(据我所知)。 您应该在库的适配器中更改此视图的数据,并调用“notifyDataSetChange()”。在适配器的getView中,您可以根据数据更改视图的位图...(例如,您可以检查是否已加载位图,如果不使用资源中的默认图像...)
如果那不是你的意思,请澄清。你使用什么样的适配器等...
祝你好运, JPM