2015-10-20 2 views
1

My ListView (StickyListHeadersListView) не сохраняет точную позицию прокрутки. Я это ссылка:Как сохранить позицию прокрутки для моего ListView, использующего CursorAdapter?

Maintain/Save/Restore scroll position when returning to a ListView

Когда пользователь нажимает на элемент в списке, я использую SharedPreferences, чтобы сохранить «индекс» и «сверху» до приложения переходов к деятельности. Когда я вернусь к активности, чтобы вернуться к фрагменту с помощью ListView, список переместится в верхнюю часть первого видимого элемента списка, когда он ушел, но не в точную позицию (т. Е. Если первый видимый элемент обрезается на полпути , он должен быть отключен на полпути при возврате к фрагменту).

Другими словами, смещение не сохраняется. Как я уже сказал, он может сохранить первую видимую позицию, но точный свиток не сохраняется.

mAdapter = new PeopleAdapter(getActivity(), null); 
    mList = (StickyListHeadersListView) rootView.findViewById(R.id.stickyList); 
    mList.setAdapter(mAdapter); 
    mList.setAreHeadersSticky(true); 
    mList.setDividerHeight(0); 
    mList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Cursor cursor = mAdapter.getCursor(); 
      if (cursor != null && cursor.moveToPosition(position)) { 
       MainActivity.setIndex(mList.getFirstVisiblePosition()); 
       View v = mList.getListChildAt(0); 
       int top = (v == null) ? 0 : (v.getTop() - mList.getPaddingTop()); 
       MainActivity.setTop(top); 
       Intent intent = new Intent(getActivity(), ContactDetailActivity.class); 
       startActivity(intent); 
     } 
    }); 

После того, как курсор загрузится, я звоню

public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     android.util.Log.i(TAG, "Cursor loaded. (" + data.getCount() + " rows)"); 
     mList.setSelectionFromTop(MainActivity.getIndex(), MainActivity.getTop()); 
     mAdapter.changeCursor(data); 
     mAdapter.notifyDataSetChanged(); 
} 

ответ

0

Можно использовать savedInstanceState, чтобы сохранить точный свиток ListView однако, это уничтожается вместе с активностью при многих обстоятельствах и мы не можем с легкостью сохранить сохраненный файлInstanceState, поскольку мы можем только реально преобразовать его в объект Parcelable, который не предназначен для сохранения. Даже когда вы пытаетесь получить сохраненноеInstanceState из ListView, у нас есть несколько проблем. null часто возвращается нам, поскольку спецификация документации для Android происходит, когда «ничего интересного сохранить». Ну, в этом случае свиток довольно интересный! К сожалению, Android не всегда дает нам это, хотя и вызывает много проблем ...

На самом деле, я посмотрел это немного больше и заметил, что в документации на Android сказано: «Это состояние должно содержать только информацию который не является постоянным или не может быть восстановлен позже. Например, вы никогда не будете хранить свою текущую позицию на экране, потому что это будет вычислено снова, когда новый экземпляр представления будет помещен в его иерархию представлений. », так что это не путь.

Конечно, мы все еще можем использовать метод, который вы используете, но он никогда не будет точным на всех устройствах. Для общего приложения я бы рекомендовал просто сохранить индекс элемента списка и снова запустить пользователя.

Я не верю, что есть другие методы, которые мы можем использовать для доступа к позиции прокрутки, кроме получения деталей из самого списка. Поэтому мы можем использовать только то, что нам дано.

Вы можете быть супер сумасшедшим умом и попробовать поставить ListView в ScrollView (или некоторые другие контейнеры тоже будут работать), где мы можем использовать такие методы, как getScrollY() и setScrollY(), но это всегда зависит от них это то же количество элементов списка, и все элементы списка остаются одного размера.

Смежные вопросы