【问题标题】:Scroll position is not saved in Grdiview滚动位置未保存在 Gridview 中
【发布时间】:2017-03-19 00:58:21
【问题描述】:

有人可以帮我我在滚动 GridView 时遇到问题我所做的是我从 API 显示 GridView 中的前 10 个产品。现在我需要的是 - 当用户滚动并获取列表的最后一个位置时然后 API 再次以页面值 2 命中 .. 滚动显示从用户所在的当前位置.. 现在显示数据并且适配器更改其值.. 但是当新 API 命中时滚动显示在顶部......可以任何人请告诉我要做什么???真的很感激请帮忙..

我做什么 -

        grid.setOnScrollListener(new AbsListView.OnScrollListener() {
        int last_item;

        @Override
        public void onScrollStateChanged(AbsListView view, int   scrollState) {

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                             int visibleItemCount, int totalItemCount)      {


            int lastitem = firstVisibleItem + visibleItemCount;
            if(lastitem == totalItemCount){

                       HitApi();//This is the method where API hits with the new page value


            }


        }
    });

xml文件

       <?xml version="1.0" encoding="utf-8"?>
       <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"

       xmlns:android="http://schemas.android.com/apk/res/android">


        <GridView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/products_GridView"
        android:numColumns="auto_fit"
        android:listSelector="@android:color/transparent"
        android:verticalSpacing="1dp"
        android:horizontalSpacing="1dp"
        >
       </GridView>


        </LinearLayout>

【问题讨论】:

  • 我真的不明白你的目标是什么!当用户导航到另一个活动并返回到 gridView 活动时,您是否需要保存滚动位置?页面值 2 是什么意思?你能给我们看一个更能描述情况的演示或屏幕截图吗
  • 不,我不打算进行下一个活动.. 只是我的适配器数据会随着新值的变化而变化,并且每次滚动和数据更改时,滚动都位于顶部。它将从新数据加载或添加到列表的位置开始
  • 我会假设你正在使用滚动视图对吗?它在线性布局中吗?请与我们分享您的 xml
  • 我使用的是简单的 Gridview。请检查
  • 还包括您的 notifyDataSetChanged() 如果它是您用来更新列表的方式或包括列表更新方法:)

标签: android scrollview android-view scroll-position


【解决方案1】:

好吧,假设hitApi()用新项目更新ListView,那么该方法可能会在当前列表上调用.clear(),这将导致问题,然后它会添加新项目;为了保持最后一个位置,您必须在 hitApi() 方法之前添加它:

int i = yourList.getFirstVisiblePosition();
View v = yourList.getChildAt(0);
int t = 0;
if(v!=null)v.getTop();

然后调用hitApi()方法后,将旧位置设置回来:

yourList.setSelectionFromTop(i, t);

【讨论】:

    【解决方案2】:

    试试这个...

        /***
         * LodeMore Variables
         */
        private int lastVisibleItem, totalItemCount;
        private int visibleThreshold = 1;
        private int index = 1;
        private boolean loading;
    
     private void initLodeMoreAdapter()
        {
    
            if (recyclerView.getLayoutManager() instanceof GridLayoutManager)
            {
    
                final GridLayoutManager linearLayoutManager = (GridLayoutManager) rvResponse.getLayoutManager();
                rvResponse.addOnScrollListener(new RecyclerView.OnScrollListener()
                {
    
                    @Override
                    public void onScrolled(RecyclerView recyclerView, int dx, int dy)
                    {
                        super.onScrolled(recyclerView, dx, dy);
    
    
                        totalItemCount = linearLayoutManager.getItemCount();
                        lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
                        if (!loading &&totalItemCount <= (lastVisibleItem + visibleThreshold))
                        {
                            // End has been reached
                            // Do something
                loading = true;
                            getResponseListing();
                        }
                    }
                });
            }
        }
    
     private void getResponseListing()
        {
            if (utility.isNetworkAvailable())
            {
            API Call...
    
            adapter.notifyDataSetChanged();
    
            loading = false;
            }
        }
    

    【讨论】:

      【解决方案3】:

      在您的适配器中尝试这样的操作以获得最后一个可见位置

      public class GridAdapter extends BaseAdapter { 
        ...
        int previouslyDisplayedPosition = -1;
        ...
      
         @Override
         public View getView(int position, View convertView, ViewGroup parent) {
           if(previouslyDisplayedPosition != position) {
            ....
      
            previouslyDisplayedPosition = position;
           }
      
           return convertedView;
         }
      

      只是一个想法。不确定它是否有效。只是一个解决方法

      【讨论】:

      • 为什么要减去?任何原因?您可以在滚动时获取位置。获取当前位置
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多