Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Problems with Gallery.getChildAt(int position)

I'm trying to create a preview effect on a Gallery view and encountering issues with the Gallery.getChildAt(int position), which is returning null most of the time. It's supposed to return null only when the child is not displayed, which is not the case here, since the user need to scroll over it. Is there a way to fix this, or should I change my approach ? Here is my code:

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

EDIT: I'm not trying to populate the Gallery view, I'm already done with this part and well aware of the use of an Adapter class.

EDIT 2: Solved by changing the line :

View child = gallery.getChildAt(position);

with :

View child = gallery.getChildAt( position - gallery.getFirstVisiblePosition() );
like image 301
parser_failed Avatar asked Feb 25 '23 05:02

parser_failed


1 Answers

Your issue is that you are assuming that the position argument getChildAt takes and the position of an item in your adapter are the same -- they are not.

The position in getChildAt is the position of the child within it's parent ViewGroup, it has nothing to do with your adapter position -- that is it runs from 0 to getChildCount()-1.

You can use this in combination with getFirstVisiblePosition() which will return the position of the first item in your adapter which is visible. The first visible view is also the first child in it's parent so the position you'd pass to getChildAt for this item would be 0.

like image 173
Joseph Earl Avatar answered Mar 02 '23 18:03

Joseph Earl