【问题标题】:How to refresh current listview from another activity?如何从另一个活动刷新当前列表视图?
【发布时间】:2019-07-21 09:48:07
【问题描述】:

点击工具栏中的刷新图标后,如何从另一个或主Activity刷新Activity1中的列表视图?

这是我预期的编码设计:

MainActivity - 创建了一个带有刷新图标的选项卡和工具栏。

Activity1 片段 - 在 tab1 中有 Listview1

Activity2 片段 - 在 tab2 中有 Listview2

点击刷新图标后,所有的列表视图都会被刷新。但是,我不知道如何从另一个活动中调用 Activity1 中的刷新函数。

以下代码用于在Activity1中刷新listview(listView_monitor),如果它被自己调用,则可以正常工作:

        private void Refresh_Listview() {
            monitorList = new ArrayList<>();
            monitorList.clear();
            if (Create_Data_Array()) {
                adapter = new FGT_Monitor_ListView_Adapter(getActivity(), monitorList);     
                listView_monitor.setAdapter(adapter);
                adapter.notifyDataSetChanged();
            }
        }

请多多指教。

提前感谢。

【问题讨论】:

    标签: android listview


    【解决方案1】:

    有多种方法可以做到这一点。对我来说,最简单的方法是使用广播接收器。 例如

    内部片段 A

    @Override
    public void onResume() {
        getActivity().registerReceiver(mReceiverLocation, new IntentFilter("data_action"));
        super.onResume();
    }
    
    @Override
    public void onPause() {
        getActivity().unregisterReceiver(mReceiverLocation);
        super.onPause();
    }
    
    private BroadcastReceiver mReceiverLocation = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            try {
                Category category = (Category) intent.getSerializableExtra("category");
                Log.e("data", category.getName());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    

    来自活动(刷新点击)

    public void onClick(View view) {
    
                Intent in = new Intent("data_action");
                in.putExtra("category", category);
                context.sendBroadcast(in);
            }
    

    【讨论】:

      【解决方案2】:

      实现此目的的最简单方法是公开 Refresh_Listview 函数,并通过 Activity1 引用从 MainActivity 调用它,例如 activity1.Refresh_Listview()

      但对我来说,这不是最干净的方法。下一种方法使用接口处理这种情况。 如果您想从 MainActivity 刷新 Activity1 中的列表,如果您的刷新按钮在 MainActivity 中并在 Activity1 中列出,就是这种情况。您可以在 MainActivity 中定义接口

      public interface OnRefreshListClicked {
          void refreshList();
      }
      

      现在您需要在 Activity1 中实现该接口,您要在其中覆盖函数 refreshList,该函数将调用您的函数 Refresh_Listview()。

      public Activity1 extends Fragment implements OnRefreshListClicked

      当您这样做时,下一步就是将该引用传递给您的 MainActivity。所以在 MainActivity 中使全局私有 OnRefreshListCliked onRefreshListClicked。当您进行 Activity1 引用时,您可以将其传递给您的 onRefreshListClicked = activity1(因为您的 Activity1 实现了 OnRefreshListCliked)。现在您需要在刷新按钮单击侦听器中执行的所有操作

      if (onRefreshListClicked != null) onRefreshListClicked.refreshList();

      【讨论】:

      • 应用您的建议后,永远不会运行 onRefreshListCLicked.refreshList()。我试图调试它。 IDE 警告它没有被执行。这是 Activity1 中定义的 refreshList(): @Override public void refreshList() { Refresh_Listview(); }
      • 可能是因为它为空。你给它的值 onRefreshListClicked = activity1;在你的 MainActivity 中?
      • 如果 onRefreshListClicked = Activity1,则返回错误。这是正确的吗?如果没有,activity1 是什么?
      • 你能上传你的 MainActivity 类吗?你如何在你的 MainActivivty 中显示你的 Activity1?您需要制作 Activity1 片段的实例吗?所以你可以实例化它。它类似于 Activity1 activity1 = Activity1.newInstante();.
      • 在MainActivity中,刚刚添加了FGT_Monitor(Activity1)如下: public final FGT_Monitor fgt_monitor = new FGT_Monitor(); protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //********************* Build_Listeners_and_View(); //********************* onRefresh_Monitor_Listview_Clicked = fgt_monitor; } 公共接口 OnRefresh_Monitor_Listview_Clicked { void Refresh_Monitor_Listview();它可以 Refresh_Monitor_Listview() 但 FATAL EXCEPTION
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      相关资源
      最近更新 更多