我试图在库视图上创建预览效果,但遇到了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;
        }
    });

编辑:我不想填充gallery视图,我已经完成了这个部分,并且很清楚适配器类的使用。
编辑2:通过更改行解决:
View child = gallery.getChildAt(position);

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

最佳答案

您的问题是,您假设position参数getChildAt采用与适配器中项的位置相同的值,而不是。
getChildAt中的位置是子级在其父视图组中的位置,它与适配器的位置无关,即它从0运行到getChildCount()-1
您可以将其与getFirstVisiblePosition()结合使用,后者将返回适配器中第一个项目的可见位置。第一个可见视图也是其父视图中的第一个子视图,因此您要传递给此项的getChildAt位置将是0

10-05 17:42