Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在加载数据并将其推入未显示的RecyclerView_Java_Android_Android Recyclerview - Fatal编程技术网

Java 正在加载数据并将其推入未显示的RecyclerView

Java 正在加载数据并将其推入未显示的RecyclerView,java,android,android-recyclerview,Java,Android,Android Recyclerview,我一直在关注RecyclerView,并试图将其用于我的特定用例,但当应用程序运行时,RecyclerView是空的 我不熟悉Java和Android开发,所以我只是测试一下,试图掌握一些东西。 在这个特殊的例子中,我只是尝试列出已安装的包,其中包名以特定字符串开头,比如“com.google”应该与“com.google.camera”匹配 我的主要活动如下: public class MainActivity extends AppCompatActivity { ArrayLis

我一直在关注RecyclerView,并试图将其用于我的特定用例,但当应用程序运行时,RecyclerView是空的

我不熟悉Java和Android开发,所以我只是测试一下,试图掌握一些东西。 在这个特殊的例子中,我只是尝试列出已安装的包,其中包名以特定字符串开头,比如“com.google”应该与“com.google.camera”匹配

我的主要活动如下:

public class MainActivity extends AppCompatActivity {

    ArrayList<PackageInfo> packages = new ArrayList<PackageInfo>();
    PackageManager pm;

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

        RecyclerView lstPackages = (RecyclerView) findViewById(R.id.lstInstalledPackages);

        pm = getPackageManager();
        List<PackageInfo> allPackages = pm.getInstalledPackages(PackageManager.GET_META_DATA);
        for(PackageInfo pkg : allPackages) {
            if(pkg.packageName.startsWith("com.google")){
                packages.add(pkg);
                Log.d("PKG", "Package found: " + pkg.packageName);
            }
        }

        PackageItemAdapter adapter = new PackageItemAdapter(packages);
        lstPackages.setAdapter(adapter);
        lstPackages.setLayoutManager(new LinearLayoutManager(this));
        adapter.notifyDataSetChanged();
    }
}
PackageItemAdapter:

public class PackageItemAdapter extends RecyclerView.Adapter<PackageItemAdapter.ViewHolder> {
    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView packageName;

        public ViewHolder(View viewItem) {
            super(viewItem);

            packageName = (TextView)viewItem.findViewById(R.id.txtPackageName);
        }
    }

    private List<PackageItem> mPackages;

    public PackageItemAdapter(List<PackageInfo> packages) {
        ArrayList<PackageItem> pis = new ArrayList<PackageItem>();
        for(PackageInfo pkg : packages) {
            pis.add(new PackageItem(pkg));
        }
        mPackages = pis;
    }

    @Override
    public PackageItemAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);

        View packageView = inflater.inflate(R.layout.packageitem, parent, false);

        ViewHolder viewHolder = new ViewHolder(packageView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(PackageItemAdapter.ViewHolder viewHolder, int position) {
        PackageItem packageItem = mPackages.get(position);

        TextView tv = viewHolder.packageName;
        tv.setText(packageItem.getName());
    }

    @Override
    public int getItemCount() {
        return mPackages.size();
    }
}
公共类PackageItemAdapter扩展了RecyclerView.Adapter{
公共类ViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图包名;
公共视图持有者(视图项){
超级(视图项);
packageName=(TextView)vieItem.findViewById(R.id.txtPackageName);
}
}
私人清单包装;
公用程序包ItemAdapter(列出程序包){
ArrayList pis=新的ArrayList();
适用于(PackageInfo包装:包装){
pis.add(新包装项目(包装));
}
mPackages=pis;
}
@凌驾
public PackageItemAdapter.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
Context=parent.getContext();
LayoutFlater充气机=LayoutFlater.from(上下文);
查看包装查看=充气机。充气(R.layout.packageitem,父项,false);
ViewHolder ViewHolder=新的ViewHolder(packageView);
返回视图持有者;
}
@凌驾
BindViewHolder上的公共无效(PackageItemAdapter.ViewHolder ViewHolder,int位置){
PackageItem PackageItem=mPackages.get(位置);
TextView tv=viewHolder.packageName;
tv.setText(packageItem.getName());
}
@凌驾
public int getItemCount(){
返回mPackages.size();
}
}
packageitem.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/txtPackageName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" />
</LinearLayout>


你能看到我遗漏的任何东西吗?或者是有一些怪癖或是我必须考虑到的事情,或者我完全失控了? 您需要将Layout Manager设置为您的recyclerView,因为没有它,您的回收者就没有合适的布局,也不知道如何将您的项目视图放置在其中。 因此,在找到“回收者”视图后:

RecyclerView lstPackages = (RecyclerView) findViewById(R.id.lstInstalledPackages);
添加具有如下设置布局的行:

lstPackages.setLayoutManager(new LinearLayoutManager(this));

在将适配器分配给
recyclerview
之前,必须应用
layoutmanager
。 和
layoutmanage
应包含
recyclerview
的方向

所以,替换你的代码

 PackageItemAdapter adapter = new PackageItemAdapter(packages);
    lstPackages.setAdapter(adapter);
    lstPackages.setLayoutManager(new LinearLayoutManager(this));
    adapter.notifyDataSetChanged();
用这个

      PackageItemAdapter adapter = new PackageItemAdapter(packages);
    //set layout manager before you set adaptor. 
    lstPackages.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
    // then assign adapter to your recyclerview 
    lstPackages.setAdapter(adapter);
    //comment this line bcoz you dont need
   // adapter.notifyDataSetChanged();

因此,在一次又一次地混乱和检查之后,我发现问题在于
返回mPackageInfo.applicationInfo.name不会像任何人所想的那样返回应用程序名称。找到了一些关于这个的信息,特别是答案

我必须做一些更改,以便传递PackageManager,以便它能够获得实际的应用程序名称

主要活动变化:

PackageItemAdapter adapter = new PackageItemAdapter(packages, pm);
PackageItemAdapter更改:

public PackageItemAdapter(List<PackageInfo> packages, PackageManager pm) {
   ArrayList<PackageItem> pis = new ArrayList<>();
   for(PackageInfo pkg : packages) {
       pis.add(new PackageItem(pkg, pkg.applicationInfo.loadLabel(pm).toString()));
   }
   mPackages = pis;
}

我正在为您创建演示,并复制了整个代码,工作正常,并给我列表。
public PackageItemAdapter(List<PackageInfo> packages, PackageManager pm) {
   ArrayList<PackageItem> pis = new ArrayList<>();
   for(PackageInfo pkg : packages) {
       pis.add(new PackageItem(pkg, pkg.applicationInfo.loadLabel(pm).toString()));
   }
   mPackages = pis;
}
public class PackageItem {
    private PackageInfo mPackageInfo;
    private String mName;

    public PackageItem(PackageInfo packageInfo, String name) {
        mPackageInfo = packageInfo;
        mName = name;
    }

    public String getName() {
        return mName;
    }
}