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)
创建自定义列表视图时是否有人遇到类似问题?一如既往的任何帮助将非常感谢:)
你需要使用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滚动).
快乐的编码!