私は、さまざまな高さの多数のアイテム (動物) を持つ ListView を持っています。OnScrollListener を使用して、どのアイテムが画面上の特定の場所と交差するかを追跡しようとしています。問題の場所が であるとしcreatureMarkerBottom = 140
ます。以下のコードは、コードを実行すると誤ったデータを返すようです: 偽陽性と偽陰性を繰り返します。これがコードです。このコードは、ニワトリがマーカーと交差しているかどうかに応じて、マーカーを塗りつぶしたり透明にしたりすることになっています。ただし、フェージングは、ニワトリがスラブ/バーに触れているかどうかに実際には従いません。私の推測では、ListView ピクセルの位置を取得する方法が間違っています。
OnScrollListener listviewScrollListener = new OnScrollListener() {
int creatureLocationPixel[] = { 0, 0 };
int creatureMarkerBottom;
int creatureTop, creatureBottom;
int[] creatureLocationPixel = { 0, 0 };
View creatureView;
boolean creatureMarkerIsFaded = false;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
try {
scrollBackgroundToFindCreature(visibleItemCount, firstVisibleItem);
} catch (Exception e) {
e.printStackTrace();
}
}
private void scrollBackgroundToFindCreature(int visibleItemCount, int index) {
creatureMarkerSlabView.getLocationOnScreen(creatureLocationPixel);
creatureMarkerBottom = creatureLocationPixel[1] + creatureMarkerSlabView.getHeight();
Animal creature;
boolean found = false;
do {
creature = mAdapter.getItem(index);
creatureView = getViewForPosition(index);
creatureView.getLocationOnScreen(creatureLocationPixel);
creatureTop = creatureLocationPixel[1];
creatureBottom = creatureTop + creatureView.getHeight();
if (creatureTop < creatureMarkerBottom && creatureMarkerBottom < creatureBottom) {
found = true;
} else {
index++;
}
} while (!found && index < visibleItemCount);
if (creatureType.CHICKEN != creature.getType()) {
if (!creatureMarkerIsFaded) {
creatureMarkerIsFaded = true;
for (int x = 0; x < creatureMarkerSlabView.getChildCount(); x++)
creatureMarkerSlabView.getChildAt(x).setAlpha(TRANSPARENCY_ALPHA);
creatureMarkerSlabView.setAlpha(TRANSPARENCY_ALPHA);
}
} else {
if (creatureMarkerIsFaded) {
creatureMarkerIsFaded = false;
for (int x = 0; x < creatureMarkerSlabView.getChildCount(); x++)
creatureMarkerSlabView.getChildAt(x).setAlpha(255);
creatureMarkerSlabView.setAlpha(255);
}
}
}
};
public View getViewForPosition(int position) {
int firstPosition = animalListview.getFirstVisiblePosition() - animalListview.getHeaderViewsCount();
int wantedChild = position - firstPosition;
// Say, first visible position is 8, you want position 10, wantedChild will now be 2
// So that means your view is child #2 in the ViewGroup:
if (wantedChild < 0 || wantedChild >= animalListview.getChildCount()) {
return null;
}
return animalListview.getChildAt(wantedChild);
}