2014-09-07 3 views
0

Я использую SQLiteCursorLoader, расширив AsyncTaskLoader с помощью фрагмента списка, мне удалось сохранить позицию, когда появляются новые данные, сохраняя позицию и представление, а затем используйте setSelectionFromTop(), который работал отлично.Сохранить позицию в списке Fragment после изменения курсора в Android

Вот как это в настоящее время работает,

DB данных перед курсором перезаряжания,

Field1 int, timestamp long 
------------------ 
First row, now 
Second row, 1 minute ago 
Third row, 2 minutes ago -----> user is currently on this item in the listview 

DB после того, как курсор перезаряжания,

Field1 int, timestamp long 
------------------ 
Fourth row, now 
First row, 30 secon ago 
Second row, 1 minute + 30 seconds ago 
Third row, 2 minutes + 30 seconds ago --> go here using setSelectionFromTop(position, y) 

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

Теперь у меня есть новые требования (показано ниже), в которые будут входить не только новые данные, но и старые данные, которые изменят позиции, что изменится - это отметка времени старых данных, поэтому результат запроса, используемого в SQLiteCursorLoader, будет другим, я больше не могу использовать старый метод.

Field1 int, timestamp long 
------------------ 
First row, now 
Second row, 1 minute ago 
Third row, 2 minutes ago -----> user is currently on this item in the listview 

DB после того, как курсор перезаряжания,

Field1 int, timestamp long 
------------------ 
Third row, now 
First row, 30 secon ago 
Second row, 1 minute + 30 seconds ago 

Как вы можете видеть, что позиция не будет то же самое сейчас. Теперь я должен использовать getItemId, чтобы получить идентификатор DB и сохранить его, и когда перезагрузка курсора, мне придется пройти через него, чтобы получить его положение.

Мой вопрос: возможно ли это сделать другим способом?

Пожалуйста, дайте мне знать, если вам нужно больше разъяснений.

ответ

0

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

Сделать Cutom ListView Widget, как это:

public class BlockingListView extends ListView { 

    private boolean mBlockLayoutChildren; 

    public BlockingListView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public void setBlockLayoutChildren(boolean block) { 
     mBlockLayoutChildren = block; 
    } 

    @Override 
    protected void layoutChildren() { 
     if (!mBlockLayoutChildren) { 
      super.layoutChildren(); 
     } 
    } 
} 

И использовать этот новый виджет, как это ..

int firstVisPos = mListView.getFirstVisiblePosition(); 
View firstVisView = mListView.getChildAt(0); 
int top = firstVisView != null ? firstVisView.getTop() : 0; 

// Block children layout for now 
mListView.setBlockLayoutChildren(true); 

// Number of items added before the first visible item 
int itemsAddedBeforeFirstVisible = ...; 

// Change the cursor, or call notifyDataSetChanged() if not using a Cursor 
mAdapter.swapCursor(...); 

// Let ListView start laying out children again 
mListView.setBlockLayoutChildren(false); 

// Call setSelectionFromTop to change the ListView position 
mListView.setSelectionFromTop(firstVisPos + itemsAddedBeforeFirstVisible, top); 
Смежные вопросы