【问题标题】:notifydataSetChanged working but only showing 1 result in listview AndroidnotifydataSetChanged 工作但仅在 listview Android 中显示 1 个结果
【发布时间】:2015-08-24 08:41:31
【问题描述】:

您好,我有一个问题,当我调用 notifydataSetChanged 函数时只显示 1 个结果。我在这个论坛上读到需要清除数组列表,然后需要添加数据才能使 notifydataSetChanged 正常工作。我遵循了这一点,但问题是当新数据到达时,它会清除所有其他数据,只显示列表中的最新项目。我知道这是一个 clear() 问题,但我不知道如何解决它。任何建议将不胜感激。

我的适配器:

public MessageAdapter(Activity context, ArrayList<ArrayList<ReadMessage>> list) {
    mContext = context;
    mList = list;
    mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
    return mList.size();
}

@Override
public Object getItem(int pos) {
    return mList.get(pos);
}

@Override
public long getItemId(int position) {
    return position;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    CompleteListViewHolder viewHolder;
    if (convertView == null) {
        LayoutInflater li = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = li.inflate(R.layout.list_row, null);
        viewHolder = new CompleteListViewHolder(v);
        v.setTag(viewHolder);
    } else {
        viewHolder = (CompleteListViewHolder) v.getTag();
    }
    viewHolder.messageText.setText(mList.get(position).get(position).getMessage());
    viewHolder.fromText.setText(mList.get(position).get(position).getSender());
    return v;
}

}

class CompleteListViewHolder {
    public TextView messageText;
    public TextView fromText;

public CompleteListViewHolder(View base) {
    messageText = (TextView) base.findViewById(R.id.message);
    fromText = (TextView) base.findViewById(R.id.user);
}

以下方法是我将项目添加到列表的地方:

  private void addItemsToList() {
       sentMessages.clear();
         sentMessages.add(localstoragehandler.getUserComments(MessageService.USERNAME, friendUsername()));
      messageAdapter.notifyDataSetChanged();
}

当新数据从 Web 服务到达时调用 addItemsToList()。

谢谢

【问题讨论】:

  • 因为它不是相同的引用....适配器使用它的(简单版本)副本
  • 你的 notifyDataSetChanges 很奇怪,如果需要改变列表中的数据并调用即可,不需要 refreshAdapter
  • 我只添加了 refreshAdapter,因为我之前在一篇文章中看到它可能会修复它
  • 我已经更新了删除 refreshAdapter 函数的代码。
  • 使用 list.invalidateview() 代替 notifydatasetchanged

标签: android listview arraylist notifydatasetchanged


【解决方案1】:

可能发生的情况是您的列表sentMessages 是您用来初始化MessageAdapter 的列表,对吗?通过调用mList.clear(),因为它指向与sentMessages 相同的对象,您正在清除两个列表中的所有内容(实际上只是完全相同的列表)。我要做的是将您的 MessageAdapter 构造函数更改为以下内容:

public MessageAdapter(Activity context, ArrayList<ArrayList<ReadMessage>> list) {
    mContext = context;
    mList = new ArrayList<ArrayList<ReadMessage>>();
    mList.addAll(list);
    mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

【讨论】:

  • 感谢您的回答,我更改了consructor,但现在我没有在数组列表中得到任何项目。请有任何建议。
  • @n4zg 是的,我又看了一遍,意识到这可能会发生。我能问你为什么需要清除 ArrayList 吗?我知道你说你在这个论坛上读过它,但我真的不确定你是否需要。如果您保留原始代码,但去掉clear() 调用和addAll() 调用,会发生什么情况?所以你只需拨打sentMessages.add(...),然后拨打notifyDataSetChanged()
  • 我现在试一试,以前我用我的构造函数尝试过类似的东西,但它没有更新数组列表,我现在试试你的构造函数
  • 用新的构造函数删除 clear(),没有用,所以我恢复到我的构造函数,我在列表视图中获得所有结果,但是当新数据到达时,列表视图不会更新,直到我刷新整个片段
猜你喜欢
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多