Android 理解GetView方法的convertView参数

Android 理解GetView方法的convertView参数,android,baseadapter,convertview,Android,Baseadapter,Convertview,安卓开发者你好, 我已经阅读了关于BaseAdapter的getView方法的文档,我的理解是视图可以重用/回收,所以在使用之前应该检查该视图是否为非null并且是适当的类型。在我的例子中,每次convertview为null并创建新视图时。 虽然列表填充正确,但我想知道视图何时被回收,何时创建新视图 基本上,当你滚动列表时,它是循环使用的。当项目被隐藏时-它可以被回收并用作新的可见项目。尝试添加约100个项目并滚动它们,然后检查实际创建的视图数量。基本上,滚动列表时会循环使用。当项目被隐藏时-

安卓开发者你好, 我已经阅读了关于BaseAdapter的getView方法的文档,我的理解是视图可以重用/回收,所以在使用之前应该检查该视图是否为非null并且是适当的类型。在我的例子中,每次convertview为null并创建新视图时。
虽然列表填充正确,但我想知道视图何时被回收,何时创建新视图

基本上,当你滚动列表时,它是循环使用的。当项目被隐藏时-它可以被回收并用作新的可见项目。尝试添加约100个项目并滚动它们,然后检查实际创建的视图数量。

基本上,滚动列表时会循环使用。当项目被隐藏时-它可以被回收并用作新的可见项目。尝试添加约100个项目并滚动它们,然后检查实际创建的视图数

so should check that this view is non-null and of an appropriate type before using
因此,我相信您在ListView中使用了多个布局

In my case every time convertview is null and new view is created
这可能是因为,您没有使用:

@Override
public int getItemViewType(int position) {

    return dataArray[position].getType();
}
@Override
public int getViewTypeCount() {

    return TYPE_MAX_COUNT;
}

它不会自动循环使用,您应该检查ConvertView的可用性(非空)并使用它,而不是膨胀新视图

这样:

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

    ViewHolder holder;
    int type = getItemViewType(position);
    if (convertView == null) {

        holder = new ViewHolder();
        switch (type) {
        case TYPE1:
        //inflate type1
        break;
        case TYPE2:
        //inflate type2
        break;
        }
    convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
}
当该特定类型的视图至少膨胀一次且不再可见时(因为您滚动了列表),ConvertView可重新启动(非空)

因此,我相信您在ListView中使用了多个布局

In my case every time convertview is null and new view is created
这可能是因为,您没有使用:

@Override
public int getItemViewType(int position) {

    return dataArray[position].getType();
}
@Override
public int getViewTypeCount() {

    return TYPE_MAX_COUNT;
}

它不会自动循环使用,您应该检查ConvertView的可用性(非空)并使用它,而不是膨胀新视图

这样:

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

    ViewHolder holder;
    int type = getItemViewType(position);
    if (convertView == null) {

        holder = new ViewHolder();
        switch (type) {
        case TYPE1:
        //inflate type1
        break;
        case TYPE2:
        //inflate type2
        break;
        }
    convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
}

当该特定类型的视图至少膨胀一次且不再可见时,ConvertView可用(非空),因为您滚动了列表。

嘿,nikita,thanx,请回答。根据你的建议,我试着添加了许多项目。正如你在滚动条上所说的,新的项目正在被回收。但我有一个疑问,在滚动条之前,我的第一个项目正在被回收,其他可见的项目被创建。为什么要创建和回收第一个项目,然后再显示。@奇特拉,我已经测试过了。它向我展示了23件物品,它们都是自己创造的。当我开始滚动时,它们被回收了。您可以显示日志的示例吗?
私有类TextAdapter扩展BaseAdapter{
公共int-getCount(){
返回100;
公共视图getView(int-position,View-convertView,View-group-parent){
文本视图;
如果(convertView==null){
textview=new textview(context);
textview.setText(“新视图”+位置);
Log.v(“演示”、“创建”+位置);
textview.setText(“回收视图”+位置);
Log.v(“演示”、“回收”+位置);
}
返回文本视图;
}
我在这里有post代码。在日志中,对于位置0,我得到的第一个日志是“创建的0”,然后是“回收的0”.我哪里出错了吗?@chitra我想没关系。这可能是android的怪异行为。你使用的是什么版本?但它对你的影响不大。嘿,nikita,thanx是答案。根据你的建议,我尝试添加了许多项目。正如你在卷轴上所说的,新项目正在被回收。但我有一个疑问,在滚动之前,我的first项被回收,其他可见项被创建。为什么第一项被创建、回收然后显示。@chitra我已经测试过了。它显示了23项,都是创建的。当我开始滚动时,它们被回收。你能显示你的日志示例吗?
私有类TextAdapter扩展BaseAdapter{
public int getCount(){
返回100;
公共视图getView(int-position,View-convertView,ViewGroup-parent){
如果(convertView==null){
文本视图=新文本视图(上下文);
文本视图.settextxt(“新视图”+position)
Log.v(“演示”、“创建”+位置);
其他{
textview=(textview)convertView;
textview.setText(“回收视图”+位置);
Log.v(“演示”、“回收”+位置);
返回textview;
<
我这里有帖子代码。在日志中,对于位置0,我得到的第一个日志是“创建的0”,然后是“回收的0”。我在哪里出错了吗?@chitra我认为没关系。这可能是android的怪异行为。你使用的是什么版本?但这对你的用户来说应该没有太大的区别。