我正在使用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。
答案 0 :(得分:0)
首先,您必须计算位置(位置均值,第一个触点的位置以ArrayList
中的“ b”开头)。为此,您可以在ArrayList
中存储以“ a”,“ b”等开头的联系人数量。
因此,假设您想滑动到第一个以“ b”开头的联系人,那么它在ArrayList
中的位置等于以“ a”开头的联系人的数量。
现在,我们有了想要跳到的位置。我假设osList
是您的ListView
。
首先计算可在屏幕上占据的视图数。为此,我们需要计算pos1
(这是屏幕上“顶部可见视图”的位置)和pos2
,这是屏幕上“最后可见视图”的位置:
pos1 = osList.getFirstVisiblePosition()
pos2 = osList.getLastVisiblePosition()
现在在屏幕上可以占据的视图数量(不准确)为numScreenViews = pos2 - pos1 - 1
。这里-1是为了消除任何视图部分可见的可能性。毕竟我们有一个大概的想法。
现在位于osSwipeRight()
内:
public void onSwipeRight() {
osList.smoothScrollToPostion(min(noOfContact -1,
position + numScreenViews));
}
您无需在此处使用getChildAt()
,但是,如果您想获取posOnScreen(我称其为posOnScreen
,因为它不是ArrayList
在pos1
中的位置第一个可见联系人以“ 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 。