Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android GridView上的滚动位置跳转_Java_Android - Fatal编程技术网

Java Android GridView上的滚动位置跳转

Java Android GridView上的滚动位置跳转,java,android,Java,Android,我有一个GridView,它包含几个项目。通过单击项目,将创建一个新的详图视图。然后单击“上一步”按钮,用户将返回到GridView。我想保留精确的滚动位置,我已经通过以下代码实现了这一点: 创建GridView mArtistList = (GridView) artistsView.findViewById(R.id.gridview); mArtistAdapter = new ArtistAdapter(mContext); mArtistList.setAdapter(mArtistA

我有一个GridView,它包含几个项目。通过单击项目,将创建一个新的详图视图。然后单击“上一步”按钮,用户将返回到GridView。我想保留精确的滚动位置,我已经通过以下代码实现了这一点:

创建GridView

mArtistList = (GridView) artistsView.findViewById(R.id.gridview);
mArtistAdapter = new ArtistAdapter(mContext);
mArtistList.setAdapter(mArtistAdapter);

// Adapter gets items asynchronously
mArtistAdapter.registerDataSetObserver(new DataSetObserver() {

    @Override
    public void onChanged () {

        // setting first selection item
        mArtistList.setSelection(sActiveItem);

        /*
         *
         * PROBLEM HERE
         * Works ok, but when user touches the GridView
         * scroll position jumps to position where it
         * would be without this line.
         *
         */
        mArtistList.scrollBy(0, sActiveTop);

        super.onChanged();
    }
});
当用户单击GridView上的项目时

这个很好用。按下“后退”按钮后,滚动位置正好正确。当用户触摸GridView时,问题就出现了。滚动跳转到第一个可见项正好位于屏幕顶部的位置。我怎样才能防止这种跳跃

我的母语不是英语,所以我的解释可能很难理解。这就是为什么我要画一幅图像来说明问题:


存储滚动位置并在OnResume中重置。问题不是恢复滚动位置。这已经行得通了。当用户触摸屏幕时,位置跳转到错误的位置,如所附图像所示。sActiveTop=0?getChildAt0.getTop==0。尝试sActiveTop=sActiveItem.getTop;谢谢,但是不行。sActiveTop计算正确,初始滚动偏移正确。当用户触摸GridView时,就会出现问题。我认为它与GridView处理滚动的方式有关。它不使用scrollBy或类似的设置值。。。
sActiveItem = mArtistList.getFirstVisiblePosition();

// vertical spacing (5dp to pixels)
sActiveTop = (int) (5.0f * getResources().getDisplayMetrics().density);

View firstItem = mArtistList.getChildAt(0);

if (firstItem != null) {
    sActiveTop -= firstItem.getTop();
}