gpt4 book ai didi

android - RecyclerView 不显示列表中的元素

转载 作者:太空宇宙 更新时间:2023-11-03 10:34:28 27 4
gpt4 key购买 nike

我已经尝试创建一个 RecyclerView,它显示我手机上预先填充的 ArrayList 中的歌曲。这是我的 Activity 代码:

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

Audio 类有 getTitle() 和 getArtist() 方法,它们确实有效。响亮的 audio() 也有效,因此歌曲列表中肯定包含元素。这是 recyclerview 项目的 xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/recycler_item"
android:layout_width="match_parent"
android:layout_height="72dp"
android:visibility="visible">
<TextView
android:id="@+id/recycler_item_songName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:text="song name"
android:textColor="@color/textPrimary"
android:textSize="16sp"
android:textStyle="normal"
android:visibility="visible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/recycler_item_artistName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:text="song artist"
android:textColor="@color/textSecondary"
android:textSize="16sp"
android:textStyle="normal"
android:visibility="visible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/recycler_item_songName" />

</android.support.constraint.ConstraintLayout>

这是我对适配器的实现:

package com.ecebuc.gesmediaplayer;

import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;

public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {

// The dataset
private ArrayList<Audio> songList;

public static class ViewHolder extends RecyclerView.ViewHolder {

public TextView recyclerTitleView, recyclerArtistView;

public ViewHolder(View itemView) {
super(itemView);
this.recyclerTitleView = (TextView) itemView.findViewById(R.id.recycler_item_songName);
this.recyclerArtistView = (TextView) itemView.findViewById(R.id.recycler_item_artistName);
}
}

// Constructor
public SongAdapter(ArrayList<Audio> songList){
this.songList = songList;
}

@Override
public SongAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// create a new view
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View listItemView = layoutInflater.inflate(R.layout.song_list_item, parent, false);
ViewHolder viewHolder = new ViewHolder(listItemView);
return viewHolder;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Audio currentSong = songList.get(position);
holder.recyclerTitleView.setText(currentSong.getTitle());
holder.recyclerArtistView.setText(currentSong.getArtist());
Log.d("onBind: ", (String)holder.recyclerTitleView.getText() + (String)holder.recyclerArtistView.getText());
}

@Override
public int getItemCount() {
return songList.size();
}

}

令人沮丧的是,在我第一次尝试创建整个 recycleView 时,它确实有效并显示了文本。我尝试将 imageView 作为歌曲的封面添加到列表中每个项目的布局,以及显示它的代码,但它不再起作用了。当试图恢复并且只有文本代码时,它完全停止工作。

我为此苦恼不已,因为如果我确实在某个地方做了一些小改动,我现在就不知道它可能在哪里了。但我确实尝试从头开始重新创建适配器的类和整个回收器功能的布局文件,但仍然没有显示。布局项目必须在那里,因为我看到了卷轴的影子。

此外,在适配器的 onBindViewHolder 中,Log.d 会正确显示每首歌曲的标题和艺术家。并且它调用新创建的 View 的 getText()。好像文字是白色的。不,XML 中 @color/text primary 和 textSecondary 的值是 #212121 和 #424242 并且一直都是这样(同样,它确实第一次显示了值,而且我没有触及颜色)。

我在 StackOverflow 和网上都找过类似的问题,但我似乎没有出现那种错误。我不知道该怎么办了。哎呀,我什至会包括其中包含实际 recyclerView 的屏幕的 XML。在这一点上,我不知道是什么可以使这些 View 不可见:

    <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".HomeActivity"
tools:showIn="@layout/app_bar_home">

<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

最后,我想到了看我手机上的开发者选项和显示布局轮廓,这就是我所拥有的......好像没有创建两个textView,但我能够在之后获得他们的文本内容我已经设置好了,那怎么可能呢?感谢任何能帮助我的人,我只是想在这里学习... Layout outlines

最佳答案

为了将来引用,以防万一有人遇到类似问题,我设法通过简单地将回收器 View 项 XML 中的约束布局更改为线性布局(或者我猜除了约束之外的任何类型的布局)来解决它,并且编译。

它运行良好,可以正确显示所有内容。然后像以前一样将 XML 改回约束布局,一切仍然正常。在这一点上,我会说这将永远是一个谜。

关于android - RecyclerView 不显示列表中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49743836/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com