ListView重用视图...我不想要它

Lux*_*ode 42 android

我有一个ListView,每个都item包含一个ToggleButton.在我切换它然后向上或向下滚动之后,ListView正在回收视图,因此其他一些镜像正在镜像检查状态ToggleButton.我不想要这个.我该怎样预防呢?

Lil*_*ilo 78

将这两种方法添加到适配器.

@Override

public int getViewTypeCount() {                 

    return getCount();
}

@Override
public int getItemViewType(int position) {

    return position;
}
Run Code Online (Sandbox Code Playgroud)

  • 这太可怕了.@RomainGuy如果偶然发现这个,可能会流泪!您基本上告诉适配器永远不会回收视图.这将导致UI缓慢,缺乏响应能力.人们,请不要使用这个!为了您的用户! (36认同)
  • 这会禁用视图回收!! 而这正是我所需要的!在我的例子中,ListView只有5-7个单元格,但布局和内容完全不同.回收视图造成了巨大的混乱......非常感谢这次调整! (20认同)
  • 这样做相当于不使用数组列表,只使用ScrollView并调用`.addView`来抛出所有行...如果你的行中也有图像--OutOfMemory异常就在附近...... (2认同)
  • 我不知道...我有一个列表,最多包含 60 个 youtube 缩略图、标题、持续时间,以及可能的下载 PDF 文件的链接。对于笑声,为了测试这一点,我使用这种方法将其中的 100 多个放在一个列表中。不是一个问题。滚动超级流畅。我还没有在旧设备上测试过这个,但这似乎是一个很好的解决方案。 (2认同)

Xav*_*Gil 50

Android会回收列表项以达到性能目的.如果您希望ListView平滑滚动,强烈建议重复使用它们.

对于每个列表项,getView调用适配器的功能.在那里,您必须为ListView要求的项目分配值.

看看这个例子:

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    ViewHolder holder = null;

    if ( convertView == null )
    {
        /* There is no view at this position, we create a new one. 
           In this case by inflating an xml layout */
        convertView = mInflater.inflate(R.layout.listview_item, null);  
        holder = new ViewHolder();
        holder.toggleOk = (ToggleButton) convertView.findViewById( R.id.togOk );
        convertView.setTag (holder);
    }
    else
    {
        /* We recycle a View that already exists */
        holder = (ViewHolder) convertView.getTag ();
    }

    // Once we have a reference to the View we are returning, we set its values.

    // Here is where you should set the ToggleButton value for this item!!!

    holder.toggleOk.setChecked( mToggles.get( position ) );

    return convertView;
}
Run Code Online (Sandbox Code Playgroud)

请注意,这ViewHolder是我们用于回收该视图的静态类.它的属性是列表项的视图.它在您的适配器中声明.

static class ViewHolder{
    ToggleButton toggleOk;
}
Run Code Online (Sandbox Code Playgroud)

mToggles 在适配器中声明为私有属性,并使用如下公共方法进行设置:

public void setToggleList( ArrayList<Boolean> list ){
        this.mToggles = list;
        notifyDataSetChanged();
    }
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看其他自定义ListView示例.

希望能帮助到你.

  • 我知道这一切。如果视图中的数据发生变化,我希望 ListView 不会重用这些视图。 (2认同)
  • 一点都很好,我不反对重用意见的好处.但是,尝试让每个项目的toggleButton保持其正确状态(已检查或未检查)是不合理的? (2认同)