Положение прокрутки не сохраняется в 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;
}
Просто идея. Не уверен, сработает или нет. Просто работа вокруг