java - Android AlertDialog 不显示适配器名称

标签 java android android-arrayadapter android-alertdialog

我制作了一个 AllertDialog,它应该显示应用程序列表,当我单击 alerdialog 成员之一时,它确实从 ArrayAdapter 返回正确的字符串。

它看起来是这样的。

current look of the dialog

    public class AppList {

    private Activity main_activity;
    private AlertDialog app_list_dialog;

    private ArrayList<RemoteAppDetail> remoteAppDetails;

    public AppList(Activity activity){
        this.main_activity = activity;
//      init();
    }

    /**
     * Initialize the Dialog, this needs to be called before .show()/.hide().dispose();
     */
    public void init(){
        this.remoteAppDetails = ConnectionHandler.getLibrary();

        AlertDialog.Builder app_list_builder = new AlertDialog.Builder(main_activity);
        app_list_builder.setIcon(R.drawable.ic_input_add);
        app_list_builder.setTitle("Installable/Updatable Apps: ");

        final ArrayAdapter<String> app_list = new ArrayAdapter<String>(main_activity, R.layout.simple_list_item_single_choice);
        final ArrayList<String> app_name_list = getInstallableApps();

        app_list.addAll(app_name_list);


        if(!app_list.isEmpty()){
            //Add the app_list adapter (The button list)
            app_list_builder.setAdapter(app_list, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Log.i("DIALOG SELECTED", app_list.getItem(which));
                }
            });
        }else{
            app_list_builder.setMessage("There are no apps available for download/update.");
        }

        //Close Button AppList
        app_list_builder.setNegativeButton("Close", 
                new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        this.app_list_dialog = app_list_builder.create();
    }


    /**
     * Show the list.
     */
    public void show(){
        if(this.app_list_dialog != null){
            app_list_dialog.show();
        }
    }

    /**
     * Hide the list.
     */
    public void hide(){
        if(this.app_list_dialog != null){
            app_list_dialog.hide();
        }
    }

    /**
     * Disposes the list, it will need to be reinitialized of you change your mind after disposing of the list.
     */
    public void dispose(){
        if(this.app_list_dialog != null){
            app_list_dialog.dismiss();
        }
    }

    /**
     * Gets a list of apps that can be installed
     * @return Arraylist installable apps
     */
    private ArrayList<String> getInstallableApps(){
        ArrayList<String> installable_apps_list = new ArrayList<String>();
        if(this.remoteAppDetails != null){
            for(RemoteAppDetail rea : this.remoteAppDetails){
                BasicNameValuePair remote_app_info = new BasicNameValuePair(rea.filename, String.valueOf(rea.version));
                BasicNameValuePair local_app_info = getLocalAppInfo(rea.filename);

                if(local_app_info != null){             
                    if(isRemoteVersionNewer(remote_app_info, local_app_info)){
                        installable_apps_list.add(rea.filename);
                    }
                }else{
                    if(rea.unlock_status == 0){
                        installable_apps_list.add(rea.filename);
                    }
                }

            }
        }
        return installable_apps_list;
    }


    /**
     * Check if the app exists locally.
     * @param app_name_remote
     * @return Local app info as BasicNameValuePair
     */
    private BasicNameValuePair getLocalAppInfo(String app_name_remote){
        List<PackageInfo> packs = main_activity.getPackageManager().getInstalledPackages(0);
        for(PackageInfo pi : packs){
            String app_name_local = pi.applicationInfo.loadLabel(main_activity.getPackageManager()).toString();
            String app_version = String.valueOf(pi.versionCode);
            if(app_name_remote == app_name_local){
                return new BasicNameValuePair(app_name_local, app_version);
            }
        }

        return null;
    }


    /**
     * Compare local and remote app info.
     * @param remote_app_info
     * @param local_app_info
     * @return Return whether or not the remote version is newer as Boolean.
     */
    private boolean isRemoteVersionNewer(BasicNameValuePair remote_app_info, BasicNameValuePair local_app_info){
        if(remote_app_info.getName().contains(local_app_info.getName())){
            if(remote_app_info.getValue() == local_app_info.getValue()){
                return true;
            }
        }

        return false;
    }

所以我真的很想知道我做错了什么以及这些信息是否足够。

更新1: 这就是我如何称呼这个类:

Applist main_app_list = new Applist(this);
        main_app_list.init();
        main_app_list.show();

它的调用方式与我的主要 Activity 的 onCreate 方法中的方式相同。

有人建议我的 getInstallableApps() 可能会返回空值, 但是,如果您仔细检查代码,这是不可能的。因为如果它们是空的,它甚至不会有任何适配器成员。

无论哪种方式,我都添加了一些测试值,并且仍然做完全相同的事情:

        final ArrayAdapter<String> app_list = new ArrayAdapter<String>(main_activity, R.layout.simple_list_item_single_choice);
        final ArrayList<String> app_name_list = getInstallableApps();

//      app_list.addAll(app_name_list);

        app_list.add("TEST");
        app_list.add("TEST2");

其余代码保持不变。

更新2:

当我触摸其中一位成员时,它会短暂显示他们的名字,或者当我按住它时,只要我按住它,它就会显示他们的名字。

最佳答案

调试您的 getInstallableApps() 方法,您将看到它正在进入 for 语句,因为 this.remoteAppDetails 中有两个元素,但在内部,您获取数据的元素是否未正确调用或为空(remote_app_infolocal_app_info),或者文件名字段为空。一旦您发现是什么将空值放入数组中,您就可以修复它。

关于java - Android AlertDialog 不显示适配器名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32350420/

相关文章:

java - 尝试返回数组中的单个元素时,如何在for循环中修复 “missing return statement”?

Android NDK - 没有这样的文件或目录编译终止 - 头文件导出问题

android - ToggleButton 在自定义 ArrayAdapter<T> 中进行多重自检

java - 多次注册的条件验证

java - 删除默认的 Spring Boot 欢迎页面

android - 原生扫描二维码功能

java - 显示 HashMap 时出现问题

android - 带复选框的 ListView Holder

android - 我在 Android 版本 4.3 中使用 ListView 添加/删除 ListView 交叉应用程序的页脚?

Java数据库驱动设计