Пользовательский список прокрутки не гладкий - PullRequest
0 голосов
/ 20 февраля 2012

Я создал собственный просмотр списка, который отлично работает, за исключением того факта, что список не сглаживает прокрутку. Это изменчиво и медленно.

Вот код, где я заполняю список:

@Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            if (v == null) {
                LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.listitem, null);
        }

        FilmRecord film = films.get(position);
        if (film != null) {
            TextView filmTitle = (TextView) v.findViewById(R.id.filmtitle);
            TextView filmShowingDate = (TextView) v.findViewById(R.id.filmshowingtime);
            TextView filmAdded = (TextView) v.findViewById(R.id.filmadded);
            TextView filmLocations = (TextView) v.findViewById(R.id.filmlocations);
            TextView filmDescription = (TextView) v.findViewById(R.id.filmdescription);
            TextView filmProvider = (TextView) v.findViewById(R.id.filmprovider);
            TextView filmTicketUrl = (TextView) v.findViewById(R.id.filmticketurl);


            if (filmTitle != null) {
                filmTitle.setText(film.filmTitle);
            }

            if(filmDescription != null) {
                filmDescription.setText(film.filmDescription );
            }

            if(filmLocations != null) {
                filmLocations.setText(film.filmLocations );
            }

            if(filmShowingDate != null) {
                filmShowingDate.setText("Showing: " + film.filmShowingDate );
            }

            if(filmAdded != null) {
                filmAdded.setText("Added on: " + film.filmAdded );
            }

            if(filmProvider != null) {
                filmProvider.setText(film.filmProvider );
            }

            if(filmTicketUrl != null) {
                filmTicketUrl.setText(film.filmTicketUrl );
            }
        }

        //Check who the provider is and set the imageview to provider logo
        ImageView imageView = (ImageView) v.findViewById(R.id.providerImage);
        if(film.filmProvider.equals("Cineworld")) {
            Log.d("Provider", "Provider is Cineworld");
            imageView.setImageResource(R.drawable.cineworld);
        }
        else if(film.filmProvider.equals("Show Film Fist")){
            Log.d("Provider", "Provider is Show Film Fist");
            imageView.setImageResource(R.drawable.show_film_first);
        }

        return v;
    }

У кого-нибудь были подобные проблемы при создании пользовательского списка? Любая помощь, как всегда, будет высоко ценится:)

Ответы [ 5 ]

5 голосов
/ 20 февраля 2012

Вам необходимо использовать ViewHolder подход.

, потому что поиск View по id также требует времени для выполнения.

При использовании подхода ViewHolder вы сможете минимизировать нагрузкусозданный во время поиска View по id путем кэширования представлений:)

Здесь хороший учебник, как это сделать.

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

Подход ViewHolder:

Допустим, у вас есть 4 видимых элемента в вашем ListView одновременно.Вы должны раздувать View 4 раза и findViewById() 4 раза, только если вы прокрутите до 1000-го элемента в ListView.

Но если вы не используете ViewHolder, и вы положили

if (v == null) {
   LayoutInflater vi = ...;
}else{
   //... other implementation 
}

Вы должны раздувать только View 4 раза, но findViewById() будет называться каждый раз при вызове getView() (обычно при прокрутке ListView).

Счастливого кодирования!

1 голос
/ 20 июля 2012

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

0 голосов
/ 21 марта 2014

проверьте эту ссылку http://www.javacodegeeks.com/2012/06/android-smooth-list-scrolling.html

, а также добавьте ее в метод Activity OnCreate ()

protected void onCreate(Bundle savedInstanceState) {

    //StrictMode for smooth list scroll
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    /*----- 
        ListView 
        Custom Adapter set data....
    ------*/

}

0 голосов
/ 20 февраля 2012

Пожалуйста, обратитесь к этому вопросу и посмотрите мой ответ там. Он показывает, как вы должны объявить свои компоненты в своем классе адаптера. Внесение этих изменений в ваш класс определенно решит вашу проблему, так как вопрос, который я предложил здесь, также имел такую ​​же проблему, как Ваш: Прокручиваемый ListView с исчисленной стоимостью BaseAdapter очень медленный

0 голосов
/ 20 февраля 2012

Что вы делаете в films.get(position)?

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

При использовании базы данных вы должны загружать данные в адаптер во время onCreate, возможно, что-то подобное (но с вашим предыдущим макетом просмотра списка и т. д.)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    List<FilmRecord> values = films.getAllFilms();


    ArrayAdapter<FilmRecord> adapter = new ArrayAdapter<FilmRecord>(this,
                your_list_item_layout_id, values);
    your_list_view.setListAdapter(adapter);
}

В методе getView() вам просто нужно спросить адаптер:

FilmRecord film = getItem(position);
...