android ListView.getChildAt(i)从第二次开始返回null

时间:2014-03-03 23:06:08

标签: android listview android-listview

我正在使用contactNames的列表视图,并在用户向右滑动时尝试移动到联系人的下一个字母表。 例如:当屏幕上有anthony时,当用户滑动时,它应显示以“b”开头的联系人姓名。

所以我这样做:

 public void onSwipeRight() {
        final int offset = (int) (osList.getHeight() * .035f);
        //osList.smoothScrollToPositionFromTop(20,offset);
        Log.d("SwipeRight", "onFling: ");
        int lastPosition =osList.getLastVisiblePosition();
        viewHolder temp = (viewHolder)osList.getChildAt(lastPosition).getTag();
        String textValue = (String) temp.name.getText();
        osList.smoothScrollToPositionFromTop(getindexofnextAlphabet("textValue"),offset);

    }

但是当我第一次滑动getchildat正在工作但是从第二次开始它返回null。

1 个答案:

答案 0 :(得分:0)

首先,您必须计算位置(位置均值,第一个触点的位置以ArrayList中的“ b”开头)。为此,您可以在ArrayList中存储以“ a”,“ b”等开头的联系人数量。

因此,假设您想滑动到第一个以“ b”开头的联系人,那么它在ArrayList中的位置等于以“ a”开头的联系人的数量。

现在,我们有了想要跳到的位置。我假设osList是您的ListView

  1. 首先计算可在屏幕上占据的视图数。为此,我们需要计算pos1(这是屏幕上“顶部可见视图”的位置)和pos2,这是屏幕上“最后可见视图”的位置:

    pos1 = osList.getFirstVisiblePosition()
    pos2 = osList.getLastVisiblePosition()
    

    现在在屏幕上可以占据的视图数量(不准确)为numScreenViews = pos2 - pos1 - 1。这里-1是为了消除任何视图部分可见的可能性。毕竟我们有一个大概的想法。

  2. 现在位于osSwipeRight()内:

    public void onSwipeRight() {
      osList.smoothScrollToPostion(min(noOfContact -1, 
                                       position + numScreenViews));
    }
    

    您无需在此处使用getChildAt(),但是,如果您想获取posOnScreen(我称其为posOnScreen,因为它不是ArrayListpos1中的位置第一个可见联系人以“ b”开头的@Joel),再次计算posOnScreen,然后计算void pre(int *grid, int x, int y) { const int base = 8; for (int y = 0; y < base; y++) { for (int x = 0; x < base; x++) { printf("%d ", *(grid+x*base+y)); } printf("\n"); } } int main(int argc, char **argv) { const int base = 8; int cursor = 0; int grid[base][base]; for (int y = 0; y < base; y++) { for (int x = 0; x < base; x++) { grid[x][y] = x; } } pre((int*)grid, base, base); } =视图的位置(此处,第一个联系人的位置在arrayList中以字母“ b”开头)-pos1 。