我制作了一个 AllertDialog,它应该显示应用程序列表,当我单击 alerdialog 成员之一时,它确实从 ArrayAdapter 返回正确的字符串。
它看起来是这样的。
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_info
、local_app_info
),或者文件名字段为空。一旦您发现是什么将空值放入数组中,您就可以修复它。
关于java - Android AlertDialog 不显示适配器名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32350420/