シナリオ:アプリケーションの詳細を含む 2 つのアレイ リストがあります。1 つの ArrayList にはすべてのアプリケーションのコレクションがあり、2 番目の ArrayList には選択されたアプリケーションのコレクションがあります。そして、選択したアプリケーションをすべてのアプリケーション リストから削除する必要があります。このために、ArrayList.removeAll 関数を使用しました。
問題 : ArrayList.removeAll は完全に正常に動作していますが、1 つの問題は、選択したアプリケーション配列リストに同じ名前の 2 つのアプリから 1 つのアプリケーションがある場合です (ただし、他のプロパティは異なります)。AngryBirds... リストから両方のアプリを削除します。
私はこのように使用しています:
mInstalledApplicationList = new ArrayList<App>();
mInstalledApplicationList.addAll(ApplicationList.mInstalledAppList);
Log.e(TAG, "Total Installed App Size : " + ApplicationList.mInstalledAppList.size());
mInstalledApplicationList.removeAll(ApplicationList.mSelecteddAppList);
Log.e(TAG, "Filtered Installed App Size : " + mInstalledApplicationList.size());
私のAPP
コレクションクラスは次のとおりです。
import java.util.Comparator;
import java.util.List;
import android.content.ComponentName;
import android.content.Intent;
import android.graphics.drawable.Drawable;
public class App implements Comparable<App> {
private String title;
private String packageName;
private String versionName;
private int versionCode;
private String app_class;
private String installDate;
private int installDateMilli;
private List<String> appPermissions;
private Drawable mIcon;
public Intent intent;
// ordinary getters and setters
public Drawable getmIcon() {
return mIcon;
}
public void setmIcon(Drawable mIcon) {
this.mIcon = mIcon;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getDateMilli() {
return installDateMilli;
}
public void setDateMilli(int DateMilli) {
this.installDateMilli = DateMilli;
}
public List<String> getAppPermissions() {
return appPermissions;
}
public void setAppPermissions(String appPermission) {
this.appPermissions.add(appPermission);
}
public String getInstallDate() {
return installDate;
}
public void setInstallDate(String installDate) {
this.installDate = installDate;
}
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public String getVersionName() {
return versionName;
}
public void setVersionName(String versionName) {
this.versionName = versionName;
}
public int getVersionCode() {
return versionCode;
}
public void setVersionCode(int versionCode) {
this.versionCode = versionCode;
}
public String getAppClass() {
return app_class;
}
public void setAppClass(String app_class) {
this.app_class = app_class;
}
final void setActivity(ComponentName className, int launchFlags) {
intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setComponent(className);
intent.setFlags(launchFlags);
}
@Override
public int compareTo(App app) {
return 0;
}
public static Comparator<App> AppNameComparator = new Comparator<App>() {
public int compare(App app1, App app2) {
String AppName1 = app1.getTitle().toUpperCase();
String AppName2 = app2.getTitle().toUpperCase();
// ascending order
return AppName1.compareTo(AppName2);
// descending order
// return fruitName2.compareTo(fruitName1);
}
};
public static Comparator<App> AppDateComparator = new Comparator<App>() {
public int compare(App app1, App app2) {
int AppName1 = 0;
int AppName2 = 0;
AppName1 = app1.installDateMilli;
AppName2 = app2.installDateMilli;
return AppName2 - AppName1;
}
};
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof App)) {
return false;
}
App that = (App) o;
return title.equals(that.title)
&& intent.getComponent().getClassName()
.equals(that.intent.getComponent().getClassName());
}
@Override
public int hashCode() {
int result;
result = (title != null ? title.hashCode() : 0);
final String name = intent.getComponent().getClassName();
result = 31 * result + (name != null ? name.hashCode() : 0);
return result;
}
}
** App クラスを更新しました。これは私の App クラスです**
解決
次のように equals および hashCode メソッドを変更することで問題を解決しました。
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof App)) {
return false;
}
App that = (App)o;
return title.equals(that.title) && intent.getComponent().getClassName().equals(that.intent.getComponent().getClassName()) && packageName.equals(that.packageName);
}
@Override
public int hashCode() {
int result;
result = (title != null ? title.hashCode() : 0);
final String name = intent.getComponent().getClassName();
int pkg_code = (packageName != null ? packageName.hashCode() : 0);
result = 31 * result + pkg_code + (name != null ? name.hashCode() : 0);
return result;
}
助けてくれてありがとう。