2013-03-12 7 views
0

Использование прокрутки listview кажется действительно ошибкой. У меня есть listview, адаптер, на котором я готовлю все данные (со всеми сетевыми вызовами), а затем заполняю адаптер listview.ListView Прокрутка не является гладкой

Скроллинг просто не является гладким, и большую часть времени не работает, если я реализовал ListView в Scrollview

<ScrollView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 

    <ListView 
     android:id="@+id/rideList" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/customersTitle" 
     android:background="@drawable/roundcornersgreyback" 
     android:scrollbarSize="3dp" 
     android:scrollbarStyle="outsideOverlay" 
     android:scrollbars="vertical" 
     android:scrollingCache="true" 
     android:smoothScrollbar="true" 
     android:visibility="visible" /> 
</ScrollView> 

Когда я прокручиваю без ScrollView, просто использовать атрибуты самого ListView, то список прокрутки, но есть часть, которая потеряна в нижней части моего макета. Нижний колонтитул скрыт.

<ListView 
    android:id="@+id/rideList" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/customersTitle" 
    android:background="@drawable/roundcornersgreyback" 
    android:scrollbarSize="3dp" 
    android:scrollbarStyle="outsideOverlay" 
    android:scrollbars="vertical" 
    android:scrollingCache="true" 
    android:smoothScrollbar="true" 
    android:visibility="visible" /> 

Если я получим ScrollView в корневой каталог макета, просмотр списка вообще не прокручивается.

Что я делаю неправильно? Неужели это безумно нужно прокручивать список и представление?

Редактировать: Код в виде viewHolder.

+0

listview прокручивает само по себе. Не нужно помещать это в прокрутку. Опубликуйте свои треки сетевых вызовов и их отображение в списке. – Raghunandan

+0

Прежде всего, вы не должны ставить listview в виде прокрутки, и, как сказал @Raghunandan, я подозреваю, что ваши проблемы с прокруткой связаны с тем, как вы обрабатываете сетевые вызовы. –

+0

У меня нет каких-либо сетевых вызовов в коде ListView, я вызываю все сетевые материалы, прежде чем добавлять адаптер. Тем не менее, я звоню в Flurry. Но события Flurry - асинхронные, я думаю. Не должно влиять. – Siddharth

ответ

3

Из того, что я понимаю, есть, по крайней мере, две проблемы, что делает ваша реализация лага:

Прежде всего, вы используете ListView внутри ScrollView, который не является прекрасной идеей. Из документации API на ScrollView:

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

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

+0

Очень точный ответ @npace. Я призываю вас больше участвовать в stackoverflow. – Siddharth

+0

Спасибо. Я новичок как для stackoverflow, так и для разработки Android, поэтому я просто пытаюсь опубликовать сообщение, когда на самом деле знаю хороший ответ. – npace

2

The world of listview by google developers. Посмотрите на ссылку. Объясняет использование зрителя и почему он увеличивает производительность. Используйте ViewHolder в своем адаптере пользовательского списка. Переработка просмотров поможет прокрутки гладкой. Представления Thoese, которые видны на экране, не могут быть переработаны.

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

Эта ссылка http://www.vogella.com/articles/AndroidListView/article.html содержит руководства и поможет вам разобраться в ViewHolder под заголовком VIEWHOLDER PATTERN.

static class ViewHolder { 
TextView text; 
} 

ViewHolder holder = new ViewHolder(); 
if(convertView==null) 
{ 
holder.text = (TextView) convertView.findViewById(R.id.listitem_text); 
convertView.setTag(viewHolder); 
} 
holder = (ViewHolder) rowView.getTag(); 
holder.text.setText("hello); 
+0

Yup, вот как я это сделал. – Siddharth

+0

это сработало. теперь прокрутка гладкая? – Raghunandan

+0

Ответ от алтафа сделал трюк. Мне не хватало «addFooterView». И спасибо за ваш ответ. Очень кратким и точным. – Siddharth

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