2011-05-13 5 views
2

장치에 설치된 모든 응용 프로그램의 이름을 listview에 표시하는 매우 간단한 응용 프로그램을 작성하려고합니다. Google의 ListView 튜토리얼을 기본으로 사용하고 있습니다.문제점 설치된 모든 응용 프로그램의 ListView 표시 및 OnItemClickListener 구현

@Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     final PackageManager pm = this.getPackageManager(); 

     Intent intent = new Intent(Intent.ACTION_MAIN, null); 
     intent.addCategory(Intent.CATEGORY_LAUNCHER); 

     final ArrayList<ResolveInfo> list = 
       (ArrayList<ResolveInfo>) pm.queryIntentActivities(intent, 
         PackageManager.PERMISSION_GRANTED); 
     for (ResolveInfo rInfo : list) 
     { 
      Log.i(TAG, ": Installed Applications " + rInfo.activityInfo. 
        applicationInfo.loadLabel(pm).toString()); 
     } 

     final ArrayAdapter<ResolveInfo> adapter = 
      new ArrayAdapter<ResolveInfo>(this, R.layout.list_item, list) 
      { 
      @Override 
      public View getView(int position, View convertView, ViewGroup parent) 
      { 
       if (convertView == null) 
        convertView = LayoutInflater.from(parent.getContext()). 
         inflate(R.layout.list_item, parent, false); 

       final String text = list.get(position).activityInfo. 
        applicationInfo.loadLabel(pm).toString(); 
       ((TextView)convertView.findViewById(R.id.text)).setText(text); 

       final Drawable drawable = list.get(position).activityInfo.applicationInfo.loadIcon(pm); 
       ((ImageView)convertView.findViewById(R.id.image)).setImageDrawable(drawable); 

       return convertView; 
      } 

      }; 
     setListAdapter(adapter); 

     ListView lv = getListView(); 
     lv.setTextFilterEnabled(true); 
     lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

       // On Item Click Activity 
       // This is where I want to send the Package Name of the app selected to be passed to a method. 


      } 
      }); 
    } 




<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <ImageView android:id="@+id/image" 
     android:layout_width="50dp" android:layout_height="50dp" /> 
    <TextView android:id="@+id/text" 
     android:layout_width="fill_parent" android:layout_height="wrap_content" 
     android:padding="10dp" android:textSize="16sp" /> 
</LinearLayout> 

UPDATE :

여기 내 코드는 내가 지금하는 방법에 선택한 앱의 패키지 이름을 통과하는 OnItemClickListener를 사용해야합니다. 목록에 제대로 활동의 이름을 표시하려면

+0

발생한 예외를 찾으려면 LogCat을 확인하십시오. 그 질문에 대답하지 않으면 여기에 게시하십시오. – kcoppock

+0

logcat에서 오류를 확인하고 여기에 표시 할 수 있습니다. – Lavanya

+0

이 유일한 힘은 에뮬레이터에서 닫히고 실제 장치에서는 정상적으로 작동하는 것으로 나타났습니다. 불행히도 패키지 정보는 다음과 같이 표시됩니다 : ResolveInfo {4053e448 com.alphonso.pulse.NewsRack p = 0 o = 0 m = 0x108000} 더 인간이 읽을 수있게 만드는 방법에 대한 아이디어가 있습니까? –

답변

8

, 당신은 당신의 ListAdaptergetView 메소드를 오버라이드 (override) 및 (내부 클래스와 함께 작동하도록) 마지막으로 지역 변수의 일부를 설정합니다

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    final PackageManager pm = this.getPackageManager(); 

    Intent intent = new Intent(Intent.ACTION_MAIN, null); 
    intent.addCategory(Intent.CATEGORY_LAUNCHER); 

    final ArrayList<ResolveInfo> list = 
      (ArrayList<ResolveInfo>) pm.queryIntentActivities(intent, 
        PackageManager.PERMISSION_GRANTED); 
    for (ResolveInfo rInfo : list) 
    { 
     Log.i(TAG, ": Installed Applications " + rInfo.activityInfo. 
       applicationInfo.loadLabel(pm).toString()); 
    } 

    final ArrayAdapter<ResolveInfo> adapter = 
     new ArrayAdapter<ResolveInfo>(this, R.layout.list_item, list) 
     { 
      @Override 
      public View getView(int position, View convertView, ViewGroup parent) 
      { 
       convertView = super.getView(position, convertView, parent); 
       final String text = list.get(position).activityInfo. 
        applicationInfo.loadLabel(pm).toString(); 
       ((TextView)convertView).setText(text); 
       return convertView; 
      } 
     }; 
    setListAdapter(adapter); 

    ListView lv = getListView(); 
    lv.setTextFilterEnabled(true); 
} 

이를 사용자가 ArrayAdapter 사용자 지정을 구현 한 경우 TextView에 applicationinfo의 적절한 레이블이 표시됩니다.

당신이 응용 프로그램 로그 곳 또한 새 ArrayList<String>을 만들 경우,이를 달성, 사이클의 내부를 채울 수는 :

final ArrayList<String> labelList = new ArrayList<String>(); 
for (ResolveInfo rInfo : list) 
{ 
    Log.i(TAG, ": Installed Applications " + rInfo.activityInfo. 
      applicationInfo.loadLabel(pm).toString()); 
    labelList.add(rInfo.activityInfo. 
      applicationInfo.loadLabel(pm).toString()); 
} 

final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
     R.layout.list_item, labelList); 
setListAdapter(adapter); 

그런 다음 당신은 당신의 adapter의 소스로 새로운 labelList를 사용합니다.

업데이트
이 아이템 렌더러에 아이콘을 포함하려면 무시 getView 방법과 같습니다

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    if (convertView == null) 
     convertView = LayoutInflater.from(parent.getContext()). 
      inflate(R.layout.list_item, parent, false); 

    final String text = list.get(position).activityInfo. 
     applicationInfo.loadLabel(pm).toString(); 
    ((TextView)convertView.findViewById(R.id.text)).setText(text); 

    final Drawable drawable = list.get(position).activityInfo.applicationInfo.loadIcon(pm); 
    ((ImageView)convertView.findViewById(R.id.image)).setImageDrawable(drawable); 

    return convertView; 
} 

하고 res/layout/list_item.xml 레이아웃 파일은 textTextViewimage를 포함한다ImageView :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <ImageView android:id="@+id/image" 
     android:layout_width="50dp" android:layout_height="50dp" /> 
    <TextView android:id="@+id/text" 
     android:layout_width="fill_parent" android:layout_height="wrap_content" 
     android:padding="10dp" android:textSize="16sp" /> 
</LinearLayout> 
+0

답장을 보내 주셔서 감사합니다. 나는 ViewGroup을 얻고 있으며 TextView는 이클립스의 유형 오류로 해결할 수 없다. –

+0

다음에'Ctrl + Space '를 누르거나 필요한 가져 오기를 수동으로 추가하십시오 : 클래스 상단에'import android.view.ViewGroup;'과'import android.widget.TextView;'. – rekaszeru

+1

정말 고마워 ... 왜 이클립스가 가져 오는 게 좋을지 모르겠다 .... 이상하다. 나는 아마도 여기에 너무 많이 묻고 있지만 목록보기에 앱의 아이콘을 포함시키는 쉬운 방법을 알고 있습니까? –

관련 문제