2016-11-22 130 views
0

的布局,我试图设置不同的布局资源,使用此代码我的第一个列表项元素:设置第一ListView项

int type; 
@Override 
public int getItemViewType(int position) { 

    if(position==0) { 
     type = R.layout.queue_item_next; 
    } else { 
     type = R.layout.queue_item; 
    } 

    return type; 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    if(convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = (View) inflater.inflate(getItemViewType(position), parent, false); 
    } 

此代码然而可与一些意外行为。出于某种原因,ListView的最后一个元素也被设置为具有此替代布局,我不知道为什么。

什么可能导致这种情况发生?

感谢。

+0

也许是因为''convertView被重用。删除if条件并检查它是否有效? – Sanjeet

+0

我并不百分百确定,但我认为这与查看回收有关。您目前检查convertView是否为空,但我认为您还必须检查convertView的当前类型。您可以将其存储在convertView的标记中以执行此检查 – 0xDEADC0DE

+0

但未添加对convertView的检查将增加内存当数量要显示的项目很大时,违反回收视图的概念。 – Swapnil

回答

0

因为您正在使用if(convertView == null) {} 这意味着如果以前的视图在内存中可用,其他人创建一个新视图。所以,有时滚动快/慢取决于可用的手机资源。

来解决这个问题不检查if(convertView == null)

使用这样

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = (View) inflater.inflate(getItemViewType(position), parent, false); 
    } 
2

问题即将由于getItemViewType()被返回的值大于视图类型的数量。你可以使用波纹管代码对我来说工作得很好。

@Override 
    public int getItemViewType(int position) { 

     if(position==0) { 
      return 0; 
     } 
     return 1; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 2; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if(convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      int type = getItemViewType(position); 
     if(type == 0) 
      convertView = (View) inflater.inflate(R.layout.first_layout, parent, false); 
     else 
     convertView = (View) inflater.inflate(R.layout.second_layout, parent, false); 
     } 
} 

注:如果只有第一种观点是不同的,那么最好的选择是使用使用headerView使用功能listview.addHeaderView()函数这个link