我在使用时遇到了困境
if (convertview==null){
(my code)
}
或者没有。如果没有这段代码,我的 ListView 不是很快,有时会锁定几毫秒,您可以在使用中很容易注意到这一点。它只是不按其预期的方式工作。
但是当这段代码时,我的列表项将在一段时间(10 左右)后开始重新计数,并且我的列表中有一些返回的列表项(带有我使用的标题)。我使用本教程来获取带有部分 link 的 ListView 。列表的长度很好。
当然,我的列表对于重复项目的 View 完全没有用(顺便说一下,很好地划分了),但我也不希望它变慢。 有人知道该怎么办吗? 以下是我的适配器:
公共(public)类 DelftAdapter 扩展 BaseAdapter {
private Activity activity;
private List<ListItem> listItems;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader;
private final int[] bgColors = new int[] { R.color.list_odd, R.color.list_even };
public DelftAdapter(Activity a, ArrayList<ListItem> li) {
activity = a;
listItems = li;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader=new ImageLoader(activity.getApplicationContext());
}
public int getCount() {
return listItems.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
final ListItem li = listItems.get(position);
if (li != null) {
if(li.isSection()){ // is sectionheader
SectionItem si = (SectionItem)li;
vi = inflater.inflate(R.layout.sectionedlistitem, null);
vi.setOnClickListener(null);
vi.setOnLongClickListener(null);
vi.setLongClickable(false);
final TextView sectionView = (TextView) vi.findViewById(R.id.list_header_title);
sectionView.setText(si.getTitle());
}else{ // no sectionheader
ListData ld = (ListData)li;
vi = inflater.inflate(R.layout.singlelistitem, null);
TextView tvNames=(TextView)vi.findViewById(R.id.tvname);
TextView tvTip=(TextView)vi.findViewById(R.id.tvtip);
ImageView image=(ImageView)vi.findViewById(R.id.image);
tvNames.setText(ld.name);
tvTip.setText(ld.tip);
if (listItems.get(position) != null ){
imageLoader.DisplayImage(ld.photoUrl, image);
}
else{
image.setImageURI(Uri.fromFile(new File("//assets/eten.png")));
}
// alternating colors
int colorPos = position % bgColors.length;
vi.setBackgroundResource(bgColors[colorPos]);
}
}
return vi;
}
}
最佳答案
考虑使用getItemViewType()和 getViewTypeCount()与回收convertView
。当您有具有各种布局的列表项时,将使用它们。你绝对应该回收convertView
。
另请参阅http://android.amberfog.com/?p=296
就您而言:
private static final int TYPE_ITEM = 0;
private static final int TYPE_SECTION = 1;
@Override
public int getItemViewType(int position) {
return listItems.get(position).isSection() ? TYPE_SECTION : TYPE_ITEM
}
@Override
public int getViewTypeCount() {
return 2; // sectionheader and regular item
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
if (convertView == null) {
switch (type) {
case TYPE_ITEM:
convertView = mInflater.inflate(R.layout.singlelistitem, null);
...
break;
case TYPE_SECTION:
convertView = mInflater.inflate(R.layout.sectionedlistitem, null);
...
break;
}
} else {
...
}
return convertView;
}
也可以使用ViewHolder模式以获得更好的性能。
关于android - 带或不带 ConvertView 的 Listview == null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11615116/