【问题标题】:Loading data and push into a RecyclerView not showing up加载数据并推送到 RecyclerView 未显示
【发布时间】:2019-12-30 10:34:41
【问题描述】:

我一直在关注 this guide 的 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();
    }
}

包裹项目:

public class PackageItem {
    private PackageInfo mPackageInfo;

    public PackageItem(PackageInfo packageInfo) {
        mPackageInfo = packageInfo;
    }

    public String getName() {
        return mPackageInfo.applicationInfo.name;
    }

    public String getPackageId() {
        return mPackageInfo.packageName;
    }

    public String getVersion() {
        return mPackageInfo.versionName;
    }
}

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

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>

你能看到我遗漏的任何东西吗,或者有什么怪癖或我必须考虑的东西才能让它工作,还是我完全不知道?

【问题讨论】:

  • 我正在为您创建演示并复制了整个代码,它工作正常并给了我列表。

标签: java android android-recyclerview


【解决方案1】:

我之前遇到过这个问题。 您需要将布局管理器设置为您的 recyclerView,因为没有它您的 Recycler 没有适当的布局并且不知道如何将您的项目视图放置在其中。 所以在你找到你的回收站后查看:

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

添加带有设置布局的行,如

lstPackages.setLayoutManager(new LinearLayoutManager(this));

【讨论】:

    【解决方案2】:

    您必须先申请layoutmanager,然后才能将适配器分配给recyclerview。 而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();
    

    【讨论】:

      【解决方案3】:

      所以,在反复检查和检查之后,我发现问题是 PackageItem 类中的return mPackageInfo.applicationInfo.name; 没有返回应用程序名称,正如任何人所想的那样。找到了一些关于此的信息 here,特别是 this 答案。

      我必须进行一些更改,以便传递 PackageManager 以便它可以获取实际的应用程序名称。

      MainActivity 变化:

      PackageItemAdapter adapter = new PackageItemAdapter(packages, pm);
      

      PackageItemAdater 更改:

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

      PackageItem 更改:

      public class PackageItem {
          private PackageInfo mPackageInfo;
          private String mName;
      
          public PackageItem(PackageInfo packageInfo, String name) {
              mPackageInfo = packageInfo;
              mName = name;
          }
      
          public String getName() {
              return mName;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-12
        • 2022-01-26
        • 2019-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多