2013-05-02 66 views
0

我有一个CursorAdapter与newView()和bindView()覆盖。问题是bindView()没有正确映射到由newView()创建的视图。CursorAdapter bindView()没有正确映射到从newView返回的视图()

newView()返回根据游标值从不同布局膨胀的两个不同视图,如下所示。

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent){ 
    View view = null; 
    int who = //... get a value from cursor 

    switch(who){ 
    case 0: 
     view = LayoutInflater.from(context).inflate(R.layout.first, null); 
     view.setTag("case 0"); // for bindView() mapping inspection 
     break; 
    case 1: 
     view = LayoutInflater.from(context).inflater(R.layout.second, null); 
     view.setTag("case 1"); // for bindView() mapping inspection 
     break; 
    default: 
     break; 
    } 
    return view; 
} 

然后,bindView()就像平常一样。从游标获取值并将值设置为从newView()返回的视图中的UI元素。没什么特别的。我在newView()中放置了一个显示视图标记集的bindView()日志。日志显示bindView()在调用时不会获得所需的视图。

我认为,当bindView()被调用时,它绑定到现有的视图,如果有任何内存效率。所以我认为bindView会获得一个可能由row _ID标识的特定视图。但它似乎在被调用时,它只能获得任何现有的视图。

如何让bindView在视图可以有不同的布局时获取具有特定布局的指定视图?

回答

3

默认情况下,ListView中的所有项都被视为相同的视图类型。您可以覆盖getItemViewType以根据位置返回不同的值。然后视图将仅用于相同的项目视图类型。

您还想覆盖getViewTypeCount,否则getItemViewType将不起作用。

+0

谢谢你的建议。我认为这是解决问题的方法。我有另一个问题。 getItemViewType何时调用与newView有关? – seongjoo 2013-05-02 05:00:24

+0

@seongjoo - 在任何视图被夸大之前调用'getItemViewType'。流程是'getItemViewType'(确定是否将一个非空的'convertView'传递给'getView') - >'getView' - >(如果'convertView == null' then'newView') - >'bindView' – ianhanniballake 2013-05-02 05:22:50

+0

'覆盖getViewTypeCount'解决了我花了2个小时的问题 – 2016-10-16 09:38:37