7

我有2节课,

1.活动类

2.服务类

当服务有任何更新时,我需要在我的活动中更新我的列表视图。实际上我像一个聊天应用程序一样尝试,我的服务总是检查我的数据库,如果它有任何新字符串,我需要在我的活动中更新而不重建,只需要刷新列表视图。我发现它将使用 iBinder 进行操作,但我不知道如何使用它。任何人都可以向我推荐一些代码示例。

参考页面

4

3 回答 3

4

您应该使用绑定服务。我在我的应用程序中做了类似的事情。单击刷新时,我会调用一个在后台获取数据并更新 UI 的服务。

在这里查看我的服务: https ://github.com/madhur/GAnalytics/blob/develop/src/in/co/madhur/ganalyticsdashclock/AnalyticsDataService.java

@Override
protected void onPostExecute(AnalyticsAccountResult result) {
    super.onPostExecute(result);
    App.getEventBus().post(result);
}

活动: https ://github.com/madhur/GAnalytics/blob/develop/src/in/co/madhur/ganalyticsdashclock/MainActivity.java

@Subscribe
public void UpdateUI(AnalyticsAccountResult result) {
    ProgressBar progressbar = (ProgressBar) findViewById(R.id.pbHeaderProgress);
    LinearLayout spinnerLayout = (LinearLayout) findViewById(R.id.spinnerslayout);
    TextView statusMessage = (TextView) findViewById(R.id.statusMessage);

    switch (result.getStatus()) {
        case STARTING:
        statusMessage.setVisibility(View.GONE);
        progressbar.setVisibility(View.VISIBLE);
        spinnerLayout.setVisibility(View.GONE);
        break;

        case FAILURE:
        statusMessage.setVisibility(View.VISIBLE);
        progressbar.setVisibility(View.GONE);
        spinnerLayout.setVisibility(View.GONE);
        statusMessage.setText(result.getErrorMessage());
        break;

        case SUCCESS:
        statusMessage.setVisibility(View.GONE);
        progressbar.setVisibility(View.GONE);
        spinnerLayout.setVisibility(View.VISIBLE);

        if (result.getItems() != null)
        {
            this.acProfiles = result.getItems();
            MyAdapter myAdapter = new MyAdapter(acProfiles, this);
            listView.setAdapter(myAdapter);
            UpdateSelectionPreferences();
            if (result.isPersist() && acProfiles.size() > 0)
            {
                if (App.LOCAL_LOGV)
                Log.v(App.TAG, "saving configdata");        
                try
                {
                    appPreferences.saveConfigData(acProfiles, credential.getSelectedAccountName());
                }
                catch (JsonProcessingException e)
                {
                    Log.e(App.TAG, e.getMessage());
                }
            }
        }
        break;
    }
}

使用 Otto 库也很有帮助: http:
//square.github.io/otto/

于 2013-12-09T05:08:38.183 回答
3

假设您有一个名为 MainActivity 的活动类,您在其中使用名为 listviewAdapter 的适配器初始化了 ListView。将此代码放在 MainActivity 中:

  public static Handler UIHandler;

    static {
        UIHandler = new Handler(Looper.getMainLooper());
    }

    public static void runOnUI(Runnable runnable) {
        UIHandler.post(runnable); 
    }

当您在服务类中更改列表视图数据时,编写以下代码以将新数据应用于列表视图:

MainActivity.runOnUI(new Runnable()
{
    public void run()
    {
        try
        {
            MainActivity.listviewAdapter.notifyDataSetChanged();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
});
于 2014-09-01T23:31:42.003 回答
0

如果没有更多信息,我无法提供任何有用的代码示例,但是我认为您可能正在寻找的是 ListAdapter。ListAdapter 需要一个列表视图和一个数据集(在您的情况下可能是一个字符串数组)并结合 2. 每当数据集更改时(在您的情况下,这将是您的服务检测到新字符串并将其添加到数组中)您只需调用 ListAdapter.notifyDataSetChanged() 并且列表视图将使用您的新信息自动更新。检查http://developer.android.com/reference/android/widget/ArrayAdapter.html以获取有关您可能使用的特定 ListAdapter 的更多信息。

于 2013-12-09T05:12:47.603 回答