Сохранение / сохранение / восстановление позиции прокрутки при возврате в ListView

Если вам не нужна строка, которая будет сохранена в порядке, но только появится , чтобы быть в порядке, затем используйте вещь, называемую «веревка». (Это сделано из множества «строк», см.).

Я считаю, что это в основном вектор (в терминах C, массив) struct { char *begin; char *end };

. В C ++ он реализует все функции std :: string. В C вам нужно будет написать (или получить библиотеку) функции замены для всех функций strxxx ().

То, что «веревка» сделает для добавления строки в другую строку, просто вставить new begin, end pair, указывающий на новую часть строки. Также может потребоваться скопировать новый фрагмент строки, если это временный указатель. Или он может просто взять на себя ответственность за строку, если это выделенная строка.

Канат очень хорош для больших строк. Но что-то под 8 КБ быстрее справляется с memmove и memcpy.

385
задан Jonik 22 December 2013 в 20:50
поделиться

3 ответа

Попробуйте следующее:

// save index and top position
int index = mList.getFirstVisiblePosition();
View v = mList.getChildAt(0);
int top = (v == null) ? 0 : (v.getTop() - mList.getPaddingTop());

// ...

// restore index and position
mList.setSelectionFromTop(index, top);

Объяснение:

ListView.getFirstVisiblePosition () возвращает самый видимый элемент списка. Но этот элемент может быть частично прокручен вне поля зрения, и если вы хотите восстановить точное положение прокрутки списка, вам нужно получить это смещение. Итак, ListView.getChildAt (0) возвращает View для верхнего элемента списка, а затем View.getTop () - mList.getPaddingTop () возвращает его относительное смещение от верха ListView . Затем, чтобы восстановить позицию прокрутки ListView , мы вызываем ListView.setSelectionFromTop () с индексом нужного элемента и смещением, чтобы расположить его верхний край от верха ListView .

627
ответ дан 22 November 2019 в 23:49
поделиться

Чтобы разъяснить превосходный ответ Ryan Newsom и скорректировать его для фрагментов и для обычного случая, по которому мы хотим переместиться от "основного" фрагмента ListView до фрагмента "деталей" и затем обратно "ведущему устройству"

    private View root;
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
           if(root == null){
             root = inflater.inflate(R.layout.myfragmentid,container,false);
             InitializeView(); 
           } 
           return root; 
        }

    public void InitializeView()
    {
        ListView listView = (ListView)root.findViewById(R.id.listviewid);
        BaseAdapter adapter = CreateAdapter();//Create your adapter here
        listView.setAdpater(adapter);
        //other initialization code
    }

, "волшебство" здесь состоит в том, что, когда мы перешли назад от фрагмента деталей до фрагмента ListView, представление не воссоздается, мы не устанавливаем адаптер ListView, таким образом, все остается, когда мы оставили его!

0
ответ дан 22 November 2019 в 23:49
поделиться

Очень простой способ:

/** Save the position **/
int currentPosition = listView.getFirstVisiblePosition();

//Here u should save the currentPosition anywhere

/** Restore the previus saved position **/
listView.setSelection(savedPosition);

Метод setSelection сбрасывает список до предоставленного элемента. Если не в сенсорном режиме, элемент будет фактически выбран, если в сенсорном режиме элемент будет располагаться только на экране.

Более сложный подход:

listView.setOnScrollListener(this);

//Implements the interface:
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
    mCurrentX = view.getScrollX();
    mCurrentY = view.getScrollY();
}

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

}

//Save anywere the x and the y

/** Restore: **/
listView.scrollTo(savedX, savedY);
26
ответ дан 22 November 2019 в 23:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: