2015-03-02 168 views
0

我搜索了Google,但还没有找到与此相关的任何内容。如何在RecyclerView中显示已安装的应用程序?

我正在使用Android Studio创建我的第一个Material App。现在我想在RecyclerView中显示我手机上安装的所有应用程序。这可能吗?

+2

使用'PackageManager',以获取有关安装的应用程序的信息,并以此作为你的'RecyclerView'模型数据。 – CommonsWare 2015-03-02 16:28:51

回答

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" /> 

传递true

只需在您的主要活动中调用以下适配器:

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 2015-03-02 17:52:21

+0

是更好的将它们放在单独的文件中......但是它可能会将它们放在同一个文件中 – Psypher 2015-03-02 18:15:49

+0

尽管这很有帮助,但是,你的代码是一团糟...... – TheWanderer 2017-08-06 19:09:25

相关问题