Проблемы с Gallery.getChildAt (int position)

Я пытаюсь создать эффект предварительного просмотра в представлении «Галерея» и сталкиваясь с проблемами с 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; } }); 

EDIT: я не пытаюсь заполнить представление «Галерея», я уже сделал эту часть и хорошо знал об использовании класса адаптера.

EDIT 2: Решено путем изменения строки:

 View child = gallery.getChildAt(position); 

с :

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

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

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

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

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

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

Удачи, JPM