@jusalex

Как сделать работу smoothScrollToPosition в ListView более плавной?

При прокрутке ListView, постоянно меняю данные в для адаптера

ListData.setListStrings(ListData.getListStringsAll().subList(fromPosition, toPosition));


таким образом, у меня всегда есть буфер сверху и низу видимого списка. Чтобы остановить список на нужной позиции я использую метод smoothScrollToPosition. Однако при этом наблюдается неприятный скачок, а хотелось бы плавной докрутки. Аналогичное поведение и при использовании ListView.setSelection().
Есть ли какой-то способ плавно прокручивать список в моем случае, когда сильно меняется отображаемый список как сверху, так и снизу?
  • Вопрос задан
  • 3356 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Bolloky
Есть два приёма. Возможно, они вам помогут.
1. Попробуйте отображать данные не сразу, а помещая их в очередь UI потока:
public View getView( final int i, final View convertView, final ViewGroup parent ){
    View row;
    if( convertView == null ){
        // creating 
    } else{
        row = convertView;
    }

    final SomeClass idOfDataCell;
    final SomeClass2 data;
    final SomeView dataView = (SomeView)row.findViewById( R.id.id );
    // init idOfDataCell, data
    row.setTag( idOfDataCell );
    row.post( new Runnable (){
        @Override public void run ( ) {
            if( dataView.getTag().equals( idOfDataCell )){
                dataView.setData( data );
            }
        }
    });
    return row;
}

2.Отображайте часть данных после остановки прокрутки:
SomeAdapter adapter = new SomeAdapter();
listView.setOnScrollListener( new AbsListView.OnScrollListener() {
    @Override
    public void onScrollStateChanged ( AbsListView view,int scrollState ){
        if( scrollState == 2 ){
            realtyListAdapter.scrolling( true );
        } else{
            realtyListAdapter.scrolling( false );
            realtyListAdapter.notifyDataSetChanged();
        }
    }    
} );
listView.setAdapter( adapter );

class SomeAdapter extends BaseAdapter {
    private boolean scrolling;

    public void scrolling( boolean scrolling ){
        this.scrolling = scrolling;
    }

    @Override
    public View getView( final int position, final View convertView, final ViewGroup parent ){
        if( scrolling ) /* отобразить часть данных */;
        else /* отобразить все данные */ ;
        return null;
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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