2015-03-02 82 views
1

我正在使用Android Studio製作我的Android應用程序。RecyclerView中的顯示列表

我有這個代碼輸出來控制安裝在我的Android手機上的所有應用程序。

如何更改此選項,以便將列表輸出到Android應用程序的RecyclerView而不是將其輸出到控制檯?

package com.example.launcher; 

import android.app.Activity; 
import android.content.pm.PackageInfo; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 

import java.util.ArrayList; 
import java.util.List; 


public class AppInfo extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_app_info); 

    } 

    class PInfo { 
     private String appname = ""; 
     private String pname = ""; 
     private String versionName = ""; 
     private int versionCode = 0; 
     private Drawable icon; 
     private void prettyPrint() { 
      System.out.println(appname + "t" + pname + "t" + versionName + "t" + versionCode + "t"); 
     } 
    } 

    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; 
    } 

} 

回答

2

According to the Android Developer Training

  1. 你需要一個RecyclerView添加到您的活動的/片段的 佈局
  2. 創建一個自定義適配器,可以傳遞給RecyclerView
  3. 創建一個佈局,你的適配器可用於渲染單個項目

活動/片段:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); 

    // use this setting to improve performance if you know that changes 
    // in content do not change the layout size of the RecyclerView 
    mRecyclerView.setHasFixedSize(true); 

    // use a linear layout manager 
    mLayoutManager = new LinearLayoutManager(this); 
    mRecyclerView.setLayoutManager(mLayoutManager); 

    // specify an adapter (see also next example) 
    mAdapter = new PInfoAdapter(apps); 
    mRecyclerView.setAdapter(mAdapter); 

適配器:

public class PInfoAdapter extends RecyclerView.Adapter<PInfoAdapter.ViewHolder> { 
    private PInfo[] mDataset; 

    // Provide a reference to the views for each data item 
    // Complex data items may need more than one view per item, and 
    // you provide access to all the views for a data item in a view holder 
    public static class ViewHolder extends RecyclerView.ViewHolder { 
     // each data item is just a string in this case 
     public TextView mTextView; 
     public ViewHolder(ViewGroup viewGroup) { 
      super(v); 
      mTextView = viewGroup.findViewById(R.id.app_name); 
     } 
    } 

    // Provide a suitable constructor (depends on the kind of dataset) 
    public PInfoAdapter(PInfo[] myDataset) { 
     mDataset = myDataset; 
    } 

    // Create new views (invoked by the layout manager) 
    @Override 
    public PInfoAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
                int viewType) { 
     // create a new view 
     ViewGroup v = (ViewGroup) LayoutInflater.from(parent.getContext()) 
           .inflate(R.layout.your_layout, parent, false); 
     // set the view's size, margins, paddings and layout parameters 
     ... 
     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

    // Replace the contents of a view (invoked by the layout manager) 
    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     // - get element from your dataset at this position 
     // - replace the contents of the view with that element 
     holder.mTextView.setText(mDataset[position].getAppName()); 

    } 

    // Return the size of your dataset (invoked by the layout manager) 
    @Override 
    public int getItemCount() { 
     return mDataset.length; 
    } 
} 

請看看上面的鏈接,讓我知道如果你需要任何進一步的幫助。

+0

好吧,我已經看過你的代碼和鏈接,但我面臨着大量的錯誤。這裏有3個截圖http://imgur.com/a/hsd6G第一個截圖來自我的AppInfo類。所有的錯誤是「無法解析符號'mRecyclerView'」等等。第二個和第三個屏幕截圖來自我的PInfoAdapter類。這個類中的其餘錯誤是「無法解析符號......」並且在我的xml文件中,我有鏈接 – user1353517 2015-03-02 20:56:13

+0

上的示例中的Recyclerview代碼。您應該遵循android培訓獲得一個android應用程序結構的基本概念。我爲您提供了一些片段來簡化您的編輯,但我並未向您提供所有內容。首先我更新了一些地方,我忘了調整適配器的名稱。您需要爲所有以m開頭的變量創建成員變量。這應該解決一些問題。然後,您需要創建所需的佈局並分配ID。然後你需要添加getter和setter到你的類PInfo。我希望你能修正一些錯誤,但我無法解釋一切。對於進一步的問題具體問。 – 2015-03-02 21:55:23