Положение прокрутки не сохраняется в Grdiview

Может кто-нибудь, пожалуйста, помогите мне. У меня есть проблема с прокруткой GridView. Что я делаю, так это показываю первые 10 продуктов в GridView из API. Теперь мне нужно следующее: когда пользователь прокручивает и получает последнюю позицию в списке, а затем нажимает 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>

3 ответа

Решение

Хорошо, если предположить, что 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);

Попробуй это...

    /***
     * 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;
        }
    }

Попробуйте что-то вроде этого в вашем адаптере, чтобы получить последнюю видимую позицию

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;
   }

Просто идея. Не уверен, сработает или нет. Просто работа вокруг

Другие вопросы по тегам