2012-04-24 2 views
2

Там было many requests толчка, чтобы обновить widget или library на андроид, даже если некоторые люди считают, что это не такая good ui pattern (я должен сказать, Я принадлежу этому лагерю).Нажмите, чтобы обновить на Android, как в Gmail (а не тянуть, чтобы обновить как на Iphone)

Но как насчет «pull to refresh», а точнее: механизм, используемый в gmail для Android 4. Когда вы достигаете нижней части списка, вы получаете последний элемент. Но если вы снова прокрутите страницу (нажмите), появится новый элемент списка с бесконечным индикатором выполнения, и следующие письма будут загружаться и заполнять список.

Other android coders and UI designers have noticed that, но я не могу найти хороших споров об этом шаблоне, и я не могу найти реализацию этой функции, чтобы заполнить список.

Кто-нибудь видел интересное решение этой проблемы?

+0

Не что-то вроде авто освежающий тогда? Например, когда вы автоматически добавляете новые элементы в начало списка. И проблема здесь в том, что она не работает, если вы меняете контент в любом месте своего списка. – zapl

ответ

1

вы можете попробовать реализовать его самостоятельно. Его довольно легко:

Как я сделал:

1) установить onScrollStateChange вашего управления ListView:

@Override 
public void onScrollStateChanged(AbsListView listView, int scrollState) { 
    if (scrollState == SCROLL_STATE_IDLE) { 
     if (listView.getLastVisiblePosition() >= listView.getCount()-1) { 
       //scroll reached the end, trigger the method to load more itens!     
     } 
    } 
} 

2) в базовой адаптер:

private static final int TYPE_VIEW_COUNT = 2; 
private static final int TYPE_VIEW_CONTENT = 0; 
private static final int TYPE_VIEW_LOADING = 1; 

@Override 
public int getItemViewType(int position) { 

    if (position == (getCount()-1)) { 
     return TYPE_VIEW_LOADING; 
    } else { 
     return TYPE_VIEW_CONTENT; 
    }   

} 

@Override 
public int getViewTypeCount() { 
    return TYPE_VIEW_COUNT; 
} 



@Override 
public int getCount() { 
    //return list size + 1; 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View view = null; 

    switch (getItemViewType(position)) { 

    case TYPE_VIEW_CONTENT: 

     //load your content view (using convertView and then...) 

     break; 
    case TYPE_VIEW_LOADING: 
     //load your loading view (indeterminate progressbar) 
     break; 
    } 



    return view;   

} 
+0

Хороший ответ! Я бы просто добавил, что было бы неплохо иметь флаг в адаптере, который мы можем использовать, чтобы перестать показывать «загрузочный просмотр», когда мы не получим никаких новых данных. Мы можем использовать его в getItemViewType() следующим образом: if (position == (getCount() - 1) && _shouldShowProgress_) {...} – Bandreid

+0

Для показа/скрытия прогресса лучше всего использовать Spinner, чтобы использовать методы ListView: _addFooterView (View view) _ и _removeFooterView (View view) _ – Bandreid

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