【问题标题】:How do I update a TextView that stores an average of list values如何更新存储平均列表值的 TextView
【发布时间】:2012-03-02 18:23:15
【问题描述】:

我有一个由列表视图和文本视图组成的 android 活动。文本视图显示有关列表视图总和内容的信息,如果列表视图中的项目已更新,则文本视图需要反映更改。

有点像观察者模式,但其中一个组件反映了许多人的变化,而不是相反。

任务在列表视图中显示为项目,并且可以使用搜索栏更新进度以设置新的进度级别。

以下方法填充 TextView,因此我需要从 SeekBar onStopTrackingProgress 侦听器内部再次调用它。

private void populateOverviewText() {
TextView overview = (TextView) findViewById(R.id.TaskOverview);

if (!taskArrayList.isEmpty()) {

    int completion = 0;
    try {
    completion = taskHandler.getProjectCompletion();
    overview.setText("Project Completion = " + completion);
    } catch (ProjectManagementException e) {
    Log.d("Exception getting Tasks List from project",
        e.getMessage());
    }
}

}

我意识到如果我想从列表适配器调用该方法,那么我需要使该方法可访问,但我不确定执行此操作的最佳方法。

【问题讨论】:

    标签: android design-patterns observer-pattern


    【解决方案1】:

    要么让这个方法public

    或者你可以将activity传递给adapter,通过它你可以找到按钮并更新文本,或者可以直接将Button传递给adapter...

    【讨论】:

    • 如何将活动传递给适配器,例如 taskListView.setAdapter(new TaskAdapter(this, R.id.list, taskArrayList, getActivity()));然后将 Activity 设置为适配器的局部变量?这似乎将任务适配器单独耦合到此活动,我在多个活动中使用相同的任务适配器。所以这不是最合适的。按钮也一样。
    • 你说if I want to call the method from the List Adapter,如果你想从列表适配器调用它,你可以使用我在回答中描述的逻辑来调用它/更新文本视图..(你必须如何在差异活动中管理它是差异的事情,每次你都会传递差异活动上下文)
    • 我认为应该有比简单地将活动传递给适配器更合适的方法,就像注册监听器以查看项目是否更改以及它们是否更改触发更新的方法文本视图。
    • 好吧,您绝对可以将 (click/onStopTrackingProgress /etc) 侦听器(来自活动)传递给适配器,然后将其绑定到 seekbar 或所需的任何按钮...这样您的逻辑仍然处于活动状态。侦听器只是绑定到 listadapter 中所需的任何项目...
    【解决方案2】:

    使用 DataSetObserver

    我一直在寻找不涉及更改适配器代码的解决方案,以便在其他情况下可以重用适配器。

    我使用 DataSetObserver 实现了这一点

    创建 Observer 的代码非常简单,我只需在 onChanged() 方法中添加对更新 TextView 的方法的调用。

    附加观察者(添加到活动显示列表)

        final TaskAdapter taskAdapter = new TaskAdapter(this, R.id.list, taskArrayList);
    
        /* Observer */
        final DataSetObserver observer = new DataSetObserver() {
            @Override
            public void onChanged() {
                populateOverviewText();
            }
        };
    
        taskAdapter.registerDataSetObserver(observer);
    

    触发 OnChanged 方法(添加到适配器内部的 SeekBar 监听器)

        public void onStopTrackingTouch(SeekBar seekBar) {
        int progress = seekBar.getProgress();
        int task_id = (Integer) seekBar.getTag();
    
        TaskHandler taskHandler = new TaskHandler(DBAdapter
            .getDBAdapterInstance(getContext()));
    
        taskHandler.updateTaskProgress(task_id, progress);
    
        mList.get(position).setProgress(progress);
    
    
        //need to fire an update to the activity
        notifyDataSetChanged();
    
        }
    

    【讨论】:

      猜你喜欢
      • 2021-08-13
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      • 2023-01-27
      • 2016-06-14
      • 1970-01-01
      相关资源
      最近更新 更多