Java 如何在Android MVVM架构中实现对话选择选项

Java 如何在Android MVVM架构中实现对话选择选项,java,android,mvvm,Java,Android,Mvvm,我正在尝试进入MVVM模式,我的问题是我不确定我是否正确使用了它。视图负责所有的UI操作(比如show stuff?),但是当我们需要更改逻辑时会发生什么呢 所以我真正想做的是,显示一个带有特定选项的对话框,选择一个并重新加载应用程序 我已经实现了MainActivity类中的函数,并且在需要操作时使用mCountrySelection.show() public void createCountriesDialog() { AlertDialog.Builder

我正在尝试进入MVVM模式,我的问题是我不确定我是否正确使用了它。视图负责所有的UI操作(比如show stuff?),但是当我们需要更改逻辑时会发生什么呢

所以我真正想做的是,显示一个带有特定选项的对话框,选择一个并重新加载应用程序

我已经实现了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();
    }
public void createCountriesDialog()
{
AlertDialog.Builder dialogBuilder=新建AlertDialog.Builder(MainActivity.this);
dialogBuilder.setTitle(“可用国家”);
GridView GridView=新的GridView(MainActivity.this);
最后一个字符串[]countries=getResources().getStringArray(R.array.countries);
最终字符串[]代码=getResources().getStringArray(R.array.codes);
ArrayAdapter ArrayAdapter=新的ArrayAdapter(getApplicationContext(),android.R.layout.simple\u list\u item\u 1,国家/地区);
setAdapter(arrayAdapter);
dialogBuilder.setView(gridView);
dialogBuilder.setNegativeButton(“关闭”,新建DialogInterface.OnClickListener()
{
@凌驾
public void onClick(DialogInterface dialog,int which)
{
dialog.dismise();
}
});
mCountrySelection=dialogBuilder.create();
setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id)
{
PreferencesManager.setCountry(国家[职位],代码[职位]);
getSupportActionBar().setTitle(PreferencesManager.getCountry());
FragmentTransaction FragmentTransaction=getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.a_main_frame,new ArticlesFragment(),“ArticlesFragment”);
fragmentTransaction.commit();
mCountrySelection.disclose();
}
});
}
public void createAboutDialog()
{
AlertDialog.Builder aboutBuilder=新建AlertDialog.Builder(MainActivity.this);
aboutBuilder.setTitle(“热门新闻v1.0”);
aboutBuilder.setMessage(“显示newsapi.org头条新闻的简单应用程序。\n\n Freepik从www.flaticon.com制作的图标”);
aboutBuilder.setNegativeButton(“关闭”,新建DialogInterface.OnClickListener())
{
public void onClick(DialogInterface对话框,int-id)
{
dialog.dismise();
}
});
mAbout=aboutBuilder.create();
}

make1interfaceitem单击并从调用对话框的位置实现此接口

public interface ItemClick{
public void onClick(int position, String country);
}
将此接口引用传递给对话框方法

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();
            }
        });
    }
public void createCountries对话框(项目单击列表)
{
AlertDialog.Builder dialogBuilder=新建AlertDialog.Builder(MainActivity.this);
dialogBuilder.setTitle(“可用国家”);
GridView GridView=新的GridView(MainActivity.this);
最后一个字符串[]countries=getResources().getStringArray(R.array.countries);
最终字符串[]代码=getResources().getStringArray(R.array.codes);
ArrayAdapter ArrayAdapter=新的ArrayAdapter(getApplicationContext(),android.R.layout.simple\u list\u item\u 1,国家/地区);
setAdapter(arrayAdapter);
dialogBuilder.setView(gridView);
dialogBuilder.setNegativeButton(“关闭”,新建DialogInterface.OnClickListener()
{
@凌驾
public void onClick(DialogInterface dialog,int which)
{
dialog.dismise();
listener=null;
}
});
mCountrySelection=dialogBuilder.create();
setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id)
{ 
onclick(位置,国家[位置]);
PreferencesManager.setCountry(国家[职位],代码[职位]);
getSupportActionBar().setTitle(PreferencesManager.getCountry());
FragmentTransaction FragmentTransaction=getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.a_main_frame,new ArticlesFragment(),“ArticlesFragment”);
fragmentTransaction.commit();
mCountrySelection.disclose();
}
});
}
然后,当您单击网格项时,使用接口引用调用onclick方法 现在,当您将在onClick中收到回调时(int pos,String country)

使用视图模型进行api调用并重新加载屏幕


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

创建一个接口项单击并从调用对话框的位置实现此接口

public interface ItemClick{
public void onClick(int position, String country);
}
将此接口引用传递给对话框方法

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();
            }
        });
    }
public void createCountries对话框(项目单击列表)
{
AlertDialog.Builder dialogBuilder=新建AlertDialog.Builder(MainActivity.this);
dialogBuilder.setTitle(“可用国家”);
GridView GridView=新的GridView(MainActivity.this);
最后一个字符串[]countries=getResources().getStringArray(R.array.countries);
最终字符串[]代码=getResources().getStringArray(R.array.codes);
ArrayAdapter ArrayAdapter=新的ArrayAdapter(getApplicationContext(),android.R.layout.simple\u list\u item\u 1,国家/地区);
setAdapter(arrayAdapter);
dialogBuilder.setView(gridView);
dialogBuilder.setNegativeButton(“关闭”,新建DialogInterface.OnClickListener()
{
@越过
viewmodel.countryInfo.observe(this, new Observer<String>() {
   @Override
   public void onChanged(@Nullable final String newName) {
      // Update the UI
      PreferencesManager.setCountry(countries[position], codes[position]);
      getSupportActionBar().setTitle(PreferencesManager.getCountry());

      getSupportFragmentManager().beginTransaction();
         .replace(R.id.a_main_frame, new ArticlesFragment(), "ArticlesFragment");
         .commit();
   }
});
PreferencesManager.setCountry(countries[position], codes[position]);