【问题标题】:How to make the ListView properly move to the target position with a button?如何通过按钮使 ListView 正确移动到目标位置?
【发布时间】:2015-02-10 04:45:16
【问题描述】:

我有一个 ListView,我希望每次单击按钮时它都能移动到目标位置。

NextButton 工作正常,但 PrevButton 存在问题。

每当我点击 PrevButton 时,目标位置始终是新视图滚动到的第一个位置。

例如, 如果我设置这个:

mListView.setSelection(5);

滚动到目标位置后,新视图将是 5、6、6、8等位置

如何使它成为新视图的最后一个位置,例如位置 1、2、3、4、5?

我知道他们可以使用默认图库应用来做到这一点

代码:

PrevButton = (ImageButton) findViewById(R.id.Pre_Button);
        PrevButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
               ((BaseAdapter) mListView.getAdapter()).notifyDataSetChanged();
                mListView.setSelection(LastItemPos - 1);
            }
        });

NextButton = (ImageButton) findViewById(R.id.Next_Button);
        NextButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
               ((BaseAdapter) mListView.getAdapter()).notifyDataSetChanged();
                mListView.setSelection(LastItemPos + 1);
            }
        });

谢谢

【问题讨论】:

  • 你的意思是 listview 没有滚动到那个位置吗?还是希望通过单击按钮列表视图滚动到请求的位置?
  • @user1140237,它确实滚动到目标位置。问题是在滚动到目标位置之后,该位置始终是新视图的第一个位置。谢谢

标签: android android-activity android-listview android-button


【解决方案1】:

假设您在 ListView 中拥有的每个 View 的高度都相同,您所要做的就是计算出每个 View 的高度,然后将其除以 ListView 的高度。

要计算出视图高度,只需将其膨胀,使用“未指定”的 measurespec 对其进行测量,然后获取测量的高度:

public int getItemHeight(ListView listView, int listViewItemId) {
  MeasureSpec widthSpec = MeasureSpec.makeSpec(MeasureSpec.EXACTLY, listView.getWidth());
  MeasureSpec heightSpec = MeasureSpec.makeSpec(MeasureSpec.UNSPECIFIED, listView.getHeight());
  View listViewItem = LayoutInflator.from(context).inflate(R.layout.idOfListViewItem, listView, false);
  listViewItem.measure(widthSpec, heightSpec);
  return listViewItem.getHeight();
}

然后,计算要在 ListView 上定位多少项。

int itemHeight = getItemheight(listView, R.layout.layoutIdOfItem);
int numOfItems = itemHeight / listView.getHeight();

然后,每当您设置位置时,只需从位置中减去项目数。虽然你必须确保它不会低于 0。

int itemToScrollTo = 5 - numOfItems;
if (itemToScrollTo < 0) {
    itemToScrollTo = 0;
}
listView.setPosition(itemToScrollTo);

【讨论】:

  • 非常感谢 DeeV 的回答。你介意告诉我 R.layout.layoutIdOfItem 是什么 - 它是我在 MainActivity 中的布局吗?谢谢
  • 是布局文件的ID。你在 ListView 的适配器中膨胀了一个视图,对吧?这里也一样。如果您以编程方式执行此操作,那么您可以在适配器中创建一个实用方法,该方法以编程方式创建视图项。唯一重要的是您需要将要填充 ListView 的 View。
  • 哦,不,对不起,我忘了提到我正在使用 Lucasr 的 TwoWay-View。我认为它与 ListView 相似,只是它是水平滚动。我无法使用 TwoWayView..setPosition(itemToScrollTo); :-( 但是,我检查了 itemToScrollTo ,它似乎给了我在项目总数中的正确位置。你知道是否还有另一种 setPosition() 方法吗?谢谢
  • 没有。我不知道那是什么。对不起。
猜你喜欢
  • 2017-07-24
  • 1970-01-01
  • 2021-10-08
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多