2017-09-05 5 views
0

시스템 응용 프로그램을 제외한 설치된 모든 응용 프로그램으로 회 전자를 채우려고합니다.안드로이드 회 전자의 데이터 반복

1) 나는 내 스피너가 채워집니다 데이터

2)를 반복 얻고 내가 스피너 항목의 목록을 열고 때로는 차이가있을 수의 사이에 : 나는 두 가지 문제로 실행 해요 앱 이름 위의 두 가지 중 하나에

public class PackageAdapter extends BaseAdapter implements SpinnerAdapter { 

private List<ApplicationInfo> applications; 
private Context context; 
private PackageManager packageManager = null; 

public PackageAdapter(Context context) { 
    this.context = context; 

    // setting up the List applications with all the list of installed apps 
    applications = new ArrayList<ApplicationInfo>(); 
    try { 
     packageManager = context.getPackageManager(); 
     if (packageManager != null) { 
      applications = packageManager.getInstalledApplications(0); 
     } 
    } catch (Exception e) { 
     Log.e("error", e.getMessage()); 
    } 

} 

@Override 
public int getCount() { 
    return applications.size(); 
} 

@Override 
public Object getItem(int position) { 
    return applications.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return applications.indexOf(getItem(position)); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View spinView; 
    if (convertView == null) { 
     // setting up the view 
     LayoutInflater inflater = (LayoutInflater) 
       context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     spinView = inflater.inflate(R.layout.spin_layout, null); 
    } else { 
     spinView = convertView; 
    } 

    // getting one application from the list of apps. 
    final ApplicationInfo application = this.applications.get(position); 

    // filtering out the system apps and getting the application name 
    String appName = ""; 
    if (packageManager.getLaunchIntentForPackage(application.packageName) != null) { 
     appName = packageManager.getApplicationLabel(application).toString(); 
    } 
    TextView t1 = (TextView) spinView.findViewById(R.id.field1); 

    if (!appName.equals("")) { 
     t1.setText(appName); 
    } 

    return spinView; 
    } 
} 

어떤 도움을 크게 감상 할 수있다 :

아래 내 어댑터 코드를 참조하십시오! TY

답변

2

확인이 코드, 내가 장치에있는 모든 응용 프로그램의 소스 디렉토리,

이 당신에게 설치된 패키지를 줄 것이다, 당신은 또한이 일에 코드를 대체 할 수있는 빌드하고 코드 아래 테스트가 표시됩니다 스피너

의 모든 패키지
public class PackageAdapter extends BaseAdapter implements SpinnerAdapter { 

private List<String> applications = new ArrayList<>(); 
private Context context; 
private String TAG = "PackageAdapter"; 
PackageManager pm; 

public PackageAdapter(Context context) { 
    this.context = context; 

    pm = context.getPackageManager(); 
    // setting up the List applications with all the list of installed apps 
    List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA); 

    for (ApplicationInfo packageInfo : packages) { 

     if(!isSystemPackage(packageInfo)){ 
      Log.i(TAG, "Installed package :" + packageInfo.packageName); 
      Log.i(TAG, "Source dir : " + packageInfo.sourceDir); 
      applications.add(packageInfo.packageName); 
     } 
    } 

} 

@Override 
public int getCount() { 
    return applications.size(); 
} 

@Override 
public Object getItem(int position) { 
    return applications.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return applications.indexOf(getItem(position)); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View spinView; 
    if (convertView == null) { 
     // setting up the view 
     LayoutInflater inflater = (LayoutInflater) 
       context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     spinView = inflater.inflate(R.layout.spin_layout, null); 
    } else { 
     spinView = convertView; 
    } 

    TextView t1 = (TextView) spinView.findViewById(R.id.field1); 

    String packageNames = applications.get(position); 
    if (packageNames != null && !packageNames.equalsIgnoreCase("")) { 

     String appName = ""; 
     try { 
      appName = (String) pm.getApplicationLabel(pm.getApplicationInfo(applications.get(position), PackageManager.GET_META_DATA)); 
     } catch (PackageManager.NameNotFoundException e) { 
      e.printStackTrace(); 
     } 

     t1.setText(appName); 
    } 

    return spinView; 
} 


private boolean isSystemPackage(ApplicationInfo applicationInfo) { 
    return ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0); 
    } 

} 
+0

밤은 귀하의 게시물 및이에 대한 도움말은? @ 데이비드 자비스 –

+0

안녕 @Amit Vaghela 타이 당신을위한 작업이 코드! 그래서 어댑터 코드를 당신의 것으로 바꿨고 스피너는 응용 프로그램 이름이 아닌 모든 패키지 이름을 보여 주었고 스피너에는 시스템 응용 프로그램이 채워졌습니다. 사용자가 앱의 패키지 이름을 알지 못하기 때문에 내 스피너 항목을 앱 이름으로 표시해야하며 사용자가이 목록에서 시스템 앱을 선택할 수 없도록해야합니다. 이 아이디어에 맞게 코드를 수정하는 방법에 대한 아이디어가 있습니까? –

+0

업데이트 된 답변을 확인하십시오. 당신의 문제가 해결되었습니다 @ DavidJarvis –