自定义列表视图滚动不顺畅

Odh*_*ran 0 android listview custom-lists

我已经创建了一个自定义列表视图,除了列表不能平滑滚动之外,它工作得很好.它波涛汹涌,缓慢.

这是我填充listview的代码:

@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;
    }
Run Code Online (Sandbox Code Playgroud)

创建自定义列表视图时是否有人遇到类似问题?一如既往的任何帮助将非常感谢:)

Adi*_*mro 5

你需要使用ViewHolder方法.

因为通过id查找View也需要时间来执行.

通过使用ViewHolder方法,您将能够通过缓存视图来最小化在查找按ID时创建的负载:)

是一个很好的教程如何做到这一点.

编辑:

ViewHolder的做法是:

假设您一次有4个可见项目ListView.即使滚动到第1000个项目,您也必须充气View4次和findViewById()4次ListView.

但是,如果你不使用ViewHolder,你已经把

if (v == null) {
   LayoutInflater vi = ...;
}else{
   //... other implementation 
}
Run Code Online (Sandbox Code Playgroud)

你必须要膨胀View只有4次,但findViewById()将被调用每次getView()被调用(通常是当ListView滚动).

快乐的编码!