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