Проблемы с Gallery.getChildAt (int position) - PullRequest
4 голосов
/ 13 мая 2011

Я пытаюсь создать эффект предварительного просмотра в представлении «Галерея» и сталкиваюсь с проблемами с Gallery.getChildAt (int position), которая в большинстве случаев возвращает значение 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;
        }
    });

РЕДАКТИРОВАТЬ: я не пытаюсь заполнить представление галереи, я уже закончил с этой частью и хорошо знаю об использовании класса Adapter.

РЕДАКТИРОВАТЬ 2: Решено путем изменения строки:

View child = gallery.getChildAt(position);

с:

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

Ответы [ 2 ]

8 голосов
/ 16 мая 2011

Ваша проблема в том, что вы предполагаете, что аргумент position getChildAt занимает и позиция элемента в вашем адаптере одинакова - они не совпадают.

Позиция в getChildAtэто позиция дочернего элемента в его родительской ViewGroup, она не имеет ничего общего с позицией вашего адаптера - то есть она изменяется от 0 до getChildCount()-1.

Вы можете использовать это в комбинации с getFirstVisiblePosition() который вернет позицию первого элемента в вашем адаптере , который виден.Первый видимый вид также является первым дочерним элементом в его родительском элементе, поэтому позиция, которую вы передадите в getChildAt для этого элемента, будет 0.

0 голосов
/ 14 мая 2011

Вы не можете изменить элементы галереи (просмотры), как это (насколько я знаю). Вы должны изменить данные этого представления в адаптере галереи и вызвать «notifyDataSetChange ()». В getView адаптера вы можете изменить растровое изображение представления в соответствии с данными ... (например, вы можете проверить, загружено ли уже растровое изображение и, если нет, использовать изображение из ресурсов по умолчанию ...)

Если это не то, что вы имели в виду, уточните, пожалуйста. Какой тип адаптера вы используете и т.д ...

Удачи, JPM

...