【问题标题】:ListView mixed items on scroll [duplicate]滚动上的ListView混合项目[重复]
【发布时间】:2018-01-24 13:59:41
【问题描述】:

我有一个列表视图,当我滚动它时它会混合它的项目。这是我的代码:

public class ListView_MessagesAdapter extends BaseAdapter {
private List<Message> messages;

public ListView_MessagesAdapter(List<Message> messages) {
    this.messages = messages;
}

@Override
public int getCount() {
    return this.messages != null ? this.messages.size() : 0;
}

@Override
public Message getItem(int i) {
    return this.messages != null ? this.messages.get(i) : null;
}

@Override
public long getItemId(int i) {
    return this.messages != null ? i : -1;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    if (view == null)
        view = (RelativeLayout) LayoutInflater.from(this.context).inflate(R.layout.listview_messages, viewGroup, false);

    Message message = this.getItem(i);

    if (message != null) {
        switch (message.type) {
            case DEFAULT:
                this.manageAsDefault(view, message);
                break;
            case TEXT:
                this.manageAsText(view, message);
                break;
            case AUDIO:
                this.managerAsAudio(view, message);
                break;
        }
    }

    return view;
}

private void manageAsDefault(View view, Message message) {
    // Manage message...
}

private void manageAsText(View view, Message message) {
    // Manage message...
}

private void managerAsAudio(View view, Message message) {
    // Manage message...
}

}

这就是我绑定列表视图的方式:

ListView_MessagesAdapter adapter = new ListView_MessagesAdapter(messages); lstMessages.setAdapter(adapter);

我以特定顺序将列表视图与 20 条消息绑定。它第一次加载正确,但是当我滚动时,项目被混合在一起没有任何意义。

我在网上找到的任何解决方案似乎都有效。有什么解决办法吗?

【问题讨论】:

  • 请提供更多关于它如何不工作的细节。
  • 请看我的更新

标签: android listview


【解决方案1】:

getView() 中,您首先需要重置view 变量的状态。这是因为它在您滚动时被重复使用,例如,导致作为文本处理的视图被作为音频处理。

尝试做view.removeAllChildren()(或类似的东西)。

【讨论】:

  • 重置视图,它会丢失视图的状态(例如音频的再现状态)。另外,我认为重置视图通常不是一个好习惯。
  • @Loris 这是否解决了最初的问题,即项目的混合?
  • 是的,但是会产生一系列其他问题:例如,图像需要重新加载,音频也是如此。这是一种解决方法,可以纠正一个问题,但会产生其他 10 个问题。这不是正确的方法
  • @Loris 好吧,至少您知道问题出在哪里 :) 通常,当使用这样的适配器(以及 RecyclerView)时,需要这样做。如果您使用Glide 加载图像,它将自动缓存它们,至于音频,您可以将音频引用存储在您的类中Map,然后在绑定视图时通过ID 获取。
  • 我已经迁移到 RecyclerView 来检查我是否使用了错误的方法:结果是一样的。
猜你喜欢
  • 2019-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 2023-03-12
  • 1970-01-01
  • 2016-05-19
相关资源
最近更新 更多