5

私は、さまざまな高さの多数のアイテム (動物) を持つ 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);
    }
4

1 に答える 1

1

ListView childAt メソッドとlistview.getChildAt (index) のインデックスを制限するものを理解することで、問題の解決策が説明されます。問題は、 と の関係を誤解していたことlistView.getChildCount()ですadapter.getCount()

簡単に言えば:

私の実験によると、これがどのように機能するかです。ListView はアダプターのスライスです。したがって、アダプターに 500 個のアイテムがあり、ListView に 10 個のアイテムがある場合。ListView の 10 は動的ビューを表します。したがって、firstVisibleItem がアダプタの項目 217 である場合、ListView のインデックス範囲は (217,…,226) になりますが、listView.getChildCount() は 10 を返します。

したがって、答えは次のとおりです。

getChildAt(x) | x : [0+firstVisibleItem, listview.getChildCount()+firstVisibleItem)
于 2013-10-03T19:39:08.357 に答える