【问题标题】:Dynamically refreshing the ListView with changes done to database android使用对数据库 android 所做的更改动态刷新 ListView
【发布时间】:2014-01-09 17:27:18
【问题描述】:

我最关心性能问题,不希望用户等待进度。

我有一个 chatActivity,我在其中显示一个 ListView。

我在这里发送一个聊天消息

Chats chat = new Chats(chatBox.getText().toString(),Chats.TYPE_MINE, dt.format(now));
chat.personId = chatee.getMyId();
chat.isDelievered = Chats.DELIEVERED_NONE;
chats.add(chat);
mAdapter.notifyDataSetChanged();

请注意,现在聊天传递设置为无。因此,基本上该消息已被添加到聊天列表中,即使尚未发送。

现在在后面的线程中发生了什么事 在我这样做的地方发送消息需要几秒钟

  boolean bool = sendMessage(m);
  if (bool)
     chatee.isDelievered = Chats.DELIEVERED_DONE; (MESSAGE SENT)

  if (chatee.isDelievered == Chats.DELIEVERED_DONE)
  {
     app.mDbHelper.saveMessage(chatee); // SAVING TO DATABASE
     Intent i = new  Intent(Constants.REFRESH_NOTIF).putExtra("refresh",Constants.REFRESH_NOTIF);
     context.sendBroadcast(i);
  }

它将向活动发送广播。

现在问题来了。 广播调用这个函数

public void callUIMethodForRefresh(Intent intent) 
{
    String ref = intent.getStringExtra("refresh");
    if (ref == null)
    {

    }
    else if (ref.equals(Constants.REFRESH_NOTIF))
    {
    }
}

在这里,我很困惑如何重置以前添加到我的列表中的聊天对象。 需要注意的一点,我可以以非常快的速度发送消息,并且可以为旧消息调用刷新,而新消息已经输入。

  • 一种方法是我创建一个 For 循环并检查发送的消息的所有“ChatList”数组,然后替换其发送通知,但如果列表中有 1000 多个对象,这又是非常低的性能。李>
  • 有什么办法,我可以将 sqlite 数据库与我的 listView 适配器连接,它会自动检测更改并重置 listView 等?

避免性能问题的最佳策略是什么。

【问题讨论】:

  • 你想刷新什么,它是一个 Listview - 在这种情况下 ListAdapter 有一个方法 - notifyDataSetChanged() => developer.android.com/reference/android/widget/… 如果它是一个普通的 textview 和其他元素,它将对你有用,您已经重新填充或更新了 ui 上的数据并重置了 Widgets(Textview 等)中的新值

标签: java android eclipse listview


【解决方案1】:

我建议查看ContentProviders 和Loaders(特别是CusorLoader)。将这些与 CursorAdapter 结合使用,您可以使用 ContentProvider 插入/删除/更新您的 sqlite 数据库并通知您的加载器重新加载它的数据集并更新 CursorAdapter/ListView。

【讨论】:

  • 这是进行事件数据驱动的 UI 更新的正确方法,如果您需要支持 3.0 之前的设备,支持库中提供了加载器
猜你喜欢
  • 2018-10-22
  • 2013-02-22
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
相关资源
最近更新 更多