2015-03-02 2 views
0

Я искал Google, но ничего не нашел в этом отношении.Как отображать установленные приложения в RecyclerView?

Я использую Android Studio для создания своего первого приложения Material. Теперь я хочу отобразить все приложения, установленные на моем телефоне в RecyclerView. Это возможно?

+2

Используйте 'PackageManager', чтобы получить информацию об установленных приложениях, и использовать его в качестве модели данных для вашего' RecyclerView'. – CommonsWare

ответ

2

модель, чтобы сохранить информацию о пакете:

class PInfo { 
    private String appname = ""; 
    private String pname = ""; 
    private String versionName = ""; 
    private int versionCode = 0; 
    private Drawable icon; 
    public getAppName(){ 
     return appname; 
     } 
    } 

CustomAdapter установить значение имени приложения, вы можете также отображать иконки и т.д., добавляя дополнительный код. При вызове getInstalledApps вернет вам объект класса PInfo, с помощью которого вы можете получить информацию о пакете. Она принимает один параметр, передать верно, если вы хотите получить системные приложения остальное отправить ложную (ссылочный код из этого site)

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.Viewhold> { 
ArrayList<PInfo> appn; 
    public CustomAdapter() { 
     appn=p.getInstalledApps(true); 
    } 

    @Override 
    public int getItemCount() { 

      return appn.size(); 
    } 

    @Override 
    public void onBindViewHolder(Viewhold holder, int pos) { 
     for(int i=0;i<appn.size();i++{ 
      holder.appname.setText(appn.get(i).pname); 
     } 
    } 

    @Override 
    public ContactViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View itemView = LayoutInflater. 
        from(viewGroup.getContext()). 
        inflate(R.layout.yourlayout, viewGroup, false); 
     return new ContactViewHolder(itemView); 
    } 


private ArrayList<PInfo> getPackages() { 
     ArrayList<PInfo> apps = getInstalledApps(false); /* false = no system packages */ 
     final int max = apps.size(); 
     for (int i=0; i<max; i++) { 
      apps.get(i).prettyPrint(); 
     } 
     return apps; 
    } 

private ArrayList<PInfo> getInstalledApps(boolean getSysPackages) { 
    ArrayList<PInfo> res = new ArrayList<PInfo>();   
    List<PackageInfo> packs = getPackageManager().getInstalledPackages(0); 
    for(int i=0;i<packs.size();i++) { 
     PackageInfo p = packs.get(i); 
     if ((!getSysPackages) && (p.versionName == null)) { 
      continue ; 
     } 
     PInfo newInfo = new PInfo(); 
     newInfo.appname = p.applicationInfo.loadLabel(getPackageManager()).toString(); 
     newInfo.pname = p.packageName; 
     newInfo.versionName = p.versionName; 
     newInfo.versionCode = p.versionCode; 
     newInfo.icon = p.applicationInfo.loadIcon(getPackageManager()); 
     res.add(newInfo); 
    } 
    return res; 
} 
    public static class ContactViewHolder extends RecyclerView.ViewHolder{ 
     TextView appname; 
     public ViewHolder(View v) { 
     super(v); 
     appname = (TextView) v.findViewById(R.id.appname); 
    } 
    } 
} 

yourlayout.xml

<TextView 
    android:id="@+id/secondLine" 
    android:layout_width="fill_parent" 
    android:layout_height="26dip" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentRight="true" 
    android:layout_toRightOf="@id/icon" 
    android:ellipsize="marquee" 
    android:singleLine="true" 
    android:text="Description" 
    android:textSize="12sp" /> 

Просто подключите адаптер, как показано ниже, в вашем основном рабочем состоянии:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); 
    mLayoutManager = new LinearLayoutManager(this); 
    mRecyclerView.setLayoutManager(mLayoutManager); 
    mAdapter = new CustomAdapter(); 
    mRecyclerView.setAdapter(mAdapter); 

Посетите сайт, чтобы узнать о Recyclerview http://www.vogella.com/tutorials/AndroidRecyclerView/article.html

+0

Спасибо за подробный пост. Ваша помощь очень ценится! Быстрый вопрос, должен ли я иметь mainactivity для вызова адаптера, а также иметь отдельную активность для класса PInfo и класса CustomAdapter? – user1353517

+0

Да, их лучше иметь в отдельных файлах ... однако его можно получить в одном файле – Psypher

+0

Насколько это было полезно, человек, ваш код беспорядок ... – TheWanderer