java - 如何在 Android MVVM 架构中实现对话框选择

标签 java android mvvm

我正在尝试进入 MVVM 模式,但我的问题是我不确定我是否正确使用它。 View 负责所有 UI 操作(比如显示内容?),但是当我们需要更改逻辑中的某些内容时会发生什么。

所以我真正想做的是,显示一个包含某些选项的对话框,选择一个并重新加载应用程序。

我已经实现了 MainActivity 类中的功能,并且在需要操作时使用 mCountrySelection.show()。

    public void createCountriesDialog()
    {
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MainActivity.this);
        dialogBuilder.setTitle("Available Countries");

        GridView gridView = new GridView(MainActivity.this);
        final String[] countries = getResources().getStringArray(R.array.countries);
        final String[] codes = getResources().getStringArray(R.array.codes);
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, countries);
        gridView.setAdapter(arrayAdapter);

        dialogBuilder.setView(gridView);
        dialogBuilder.setNegativeButton("Close", new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                dialog.dismiss();
            }
        });

        mCountrySelection = dialogBuilder.create();

        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
                PreferencesManager.setCountry(countries[position], codes[position]);
                getSupportActionBar().setTitle(PreferencesManager.getCountry());

                FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                fragmentTransaction.replace(R.id.a_main_frame, new ArticlesFragment(), "ArticlesFragment");
                fragmentTransaction.commit();

                mCountrySelection.dismiss();
            }
        });
    }

    public void createAboutDialog()
    {
        AlertDialog.Builder aboutBuilder = new AlertDialog.Builder(MainActivity.this);
        aboutBuilder.setTitle("Top News v1.0");
        aboutBuilder.setMessage("Simple application for displaying Top Headlines from newsapi.org.\n\nIcons made by Freepik from www.flaticon.com.");
        aboutBuilder.setNegativeButton("Close", new DialogInterface.OnClickListener()
        {
            public void onClick(DialogInterface dialog, int id)
            {
                dialog.dismiss();
            }
        });

        mAbout = aboutBuilder.create();
    }

最佳答案

创建 1 个接口(interface) ItemClick 并从调用 Dialog 的位置实现此接口(interface)。

public interface ItemClick{
public void onClick(int position, String country);
}

将此接口(interface)引用传递给您的对话框方法

public void createCountriesDialog(ItemClick listner)
    {
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MainActivity.this);
        dialogBuilder.setTitle("Available Countries");

        GridView gridView = new GridView(MainActivity.this);
        final String[] countries = getResources().getStringArray(R.array.countries);
        final String[] codes = getResources().getStringArray(R.array.codes);
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, countries);
        gridView.setAdapter(arrayAdapter);

        dialogBuilder.setView(gridView);
        dialogBuilder.setNegativeButton("Close", new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                dialog.dismiss();
                listener = null;
            }
        });

        mCountrySelection = dialogBuilder.create();

        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            { 
                listener.onclick(position, countries[position]);
                PreferencesManager.setCountry(countries[position], codes[position]);
                getSupportActionBar().setTitle(PreferencesManager.getCountry());

                FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                fragmentTransaction.replace(R.id.a_main_frame, new ArticlesFragment(), "ArticlesFragment");
                fragmentTransaction.commit();

                mCountrySelection.dismiss();
            }
        });
    }

然后当点击网格项时,使用接口(interface)引用调用onclick方法 现在,当您在 onClick(int pos , String country)

中收到回调时

使用您的 View 模型进行 api 调用并重新加载屏幕。

当对话框关闭时设置listener =null以避免内存泄漏

关于java - 如何在 Android MVVM 架构中实现对话框选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55773027/

相关文章:

java - 获取静态变量(类变量)的 PropertyChangeListener 通知

java - 无法将 gdx-tools 添加到 libgdx gradle 项目

c# - 一个 ViewModel 在 WPF 中拥有一组 ViewModel 有意义吗?

c# - TreeView 的 PropertyChanged 始终为 null

java - 为什么 Java 安全点从未达到?线程挂起,安全点超时

java - 最佳图像缩放库

java - android中的访问/数据文件夹文件

android - 如何将 google play 和 testflight 中的 beta 用户转移到生产应用程序

.net - Wpf 用户控件和 MVVM

服务器和客户端中的 Java NIO?