Android RecyclerView不显示列表中的元素

Android RecyclerView不显示列表中的元素,android,android-layout,android-recyclerview,Android,Android Layout,Android Recyclerview,我尝试创建一个RecyclerView,它显示我手机上预先填充的ArrayList中的歌曲。以下是我的活动代码: public class HomeActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { private RecyclerView songRecyclerView; private RecyclerView.Adapter songRec

我尝试创建一个RecyclerView,它显示我手机上预先填充的ArrayList中的歌曲。以下是我的活动代码:

public class HomeActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

private RecyclerView songRecyclerView;
private RecyclerView.Adapter songRecyclerAdapter;
private RecyclerView.LayoutManager recyclerLayoutManager;


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

    //get the songs list for the adapter
    ArrayList<Audio> songList;
    StorageUtils storageUtils = new StorageUtils(getApplicationContext());
    songList = storageUtils.loadAudio();


    //Recycler view setup for songs display
    songRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    songRecyclerView.setHasFixedSize(true);

    recyclerLayoutManager = new LinearLayoutManager(this);
    songRecyclerView.setLayoutManager(recyclerLayoutManager);


    songRecyclerAdapter = new SongAdapter(songList);
    songRecyclerView.setAdapter(songRecyclerAdapter);
}
公共类HomeActivity扩展了AppCompatActivity
实现NavigationView.OnNavigationItemSelectedListener{
私人回收站;
私有回收器查看适配器songRecyclerAdapter;
private RecyclerView.LayoutManager recyclerLayoutManager;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
//获取适配器的歌曲列表

ArrayList

如果有人有类似的问题,我可以通过简单地将回收器视图项XML中的约束布局更改为线性布局(或者我猜除了约束之外的任何类型的布局)并编译来解决它


它工作得很好,正确地显示了所有内容。然后像以前一样将XML更改回约束布局,所有内容仍然工作得很好。在这一点上,我认为它将永远是一个谜。

对适配器构造函数进行一些更改,如下面的代码所示

    public Context context;
// Constructor
public SongAdapter(Context context,ArrayList<Audio> songList){
    this.context=context;
    this.songList = songList;
}
RecyclerView recyclerView;
SongAdapter songRecyclerAdapter;
private void setAdapter(){
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    if (songRecyclerAdapter==null) {
        songRecyclerAdapter = new SongAdapter(this,songList);
        recyclerView.setAdapter(songRecyclerAdapter);
        songRecyclerAdapter.notifyDataSetChanged();
    } 
    else{
        songRecyclerAdapter.notifyDataSetChanged();
    }
}
并删除这行代码

private RecyclerView.Adapter songRecyclerAdapter;
并使用下面的代码设置适配器

    public Context context;
// Constructor
public SongAdapter(Context context,ArrayList<Audio> songList){
    this.context=context;
    this.songList = songList;
}
RecyclerView recyclerView;
SongAdapter songRecyclerAdapter;
private void setAdapter(){
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    if (songRecyclerAdapter==null) {
        songRecyclerAdapter = new SongAdapter(this,songList);
        recyclerView.setAdapter(songRecyclerAdapter);
        songRecyclerAdapter.notifyDataSetChanged();
    } 
    else{
        songRecyclerAdapter.notifyDataSetChanged();
    }
}

哇!!相信我,你的代码看起来很完美,我最初的反应是你把文本变成了白色。好吧!我有一些东西要测试。试着在recyclerview项的xml中添加硬代码值。比如第一个textview text=“abc”和第二个“test”。查看它是否填充并注释掉OnBindView中的行看起来仍然没有任何内容…我从一开始就在项目的xml中放置了一些硬编码值,只是为了初始化。但是,是的,仍然是空行@pulkitok…很有趣。使用LinearLayout,硬编码值似乎正在工作,我我现在试着看看我的数据集中的数据是否也正确加载。等等,它在没有约束布局的情况下工作了吗?我只是胡乱猜测,可能视图中的数据被填充了,但TextView约束不正确,比如可能是您设置的约束,可能是强制TextView在手机的正常视图窗口外显示。尝试在constraint layout中旋转屏幕,查看视图是否仍然存在,或者是否也可以在平板电脑上打开应用程序。
private RecyclerView.Adapter songRecyclerAdapter;
RecyclerView recyclerView;
SongAdapter songRecyclerAdapter;
private void setAdapter(){
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    if (songRecyclerAdapter==null) {
        songRecyclerAdapter = new SongAdapter(this,songList);
        recyclerView.setAdapter(songRecyclerAdapter);
        songRecyclerAdapter.notifyDataSetChanged();
    } 
    else{
        songRecyclerAdapter.notifyDataSetChanged();
    }
}