RecyclerView 只显示一项
Posted
技术标签:
【中文标题】RecyclerView 只显示一项【英文标题】:RecyclerView show only one item 【发布时间】:2022-01-03 15:58:30 【问题描述】:我有一个问题,我想在我的第二个 Activity 中显示一个列表,但它只显示最后一个项目,而不是前一个项目。我需要在 Activity 上显示我的所有项目。
我需要做什么才能全部显示?
我的活动:
mRecyclerView = (RecyclerView)findViewById(R.id.home_recyclerview_pokemonname);
mPokemonList = new ArrayList<>();
mPokemonList.add(new MyPokemonBank("Pikachu", "Electrik"));
mPokemonList.add(new MyPokemonBank("Dracaufeu", "Feu"));
mPokemonList.add(new MyPokemonBank("Miaouss", "Normal"));
mAdapter = new MyPokemonAdapter(mPokemonList);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false));
mRecyclerView.setAdapter(mAdapter);
我的适配器:
public class MyPokemonAdapter extends RecyclerView.Adapter<MyPokemonAdapter.MyViewHolder>
ArrayList<MyPokemonBank> mPokemonList;
MyPokemonAdapter(ArrayList<MyPokemonBank> mPokemonList)
this.mPokemonList = (ArrayList<MyPokemonBank>) mPokemonList;
@NonNull
@Override
public MyPokemonAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(R.layout.pokemon_bank, parent, false);
return new MyViewHolder(view);
@Override
public void onBindViewHolder(@NonNull MyPokemonAdapter.MyViewHolder holder, int position)
holder.display(mPokemonList.get(position));
@Override
public int getItemCount()
return mPokemonList.size();
public class MyViewHolder extends RecyclerView.ViewHolder
private TextView mPokemonName;
private TextView mPokemonType;
public MyViewHolder(@NonNull View itemView)
super(itemView);
mPokemonName = (TextView)itemView.findViewById(R.id.name);
mPokemonType = (TextView)itemView.findViewById(R.id.type);
public void display(MyPokemonBank myPokemonBank)
this.mPokemonName.setText(MyPokemonBank.getName());
this.mPokemonType.setText(MyPokemonBank.getType());
【问题讨论】:
检查尺寸mPokemonList.size()
.
你能分享你的视图xml文件吗?
我已经用我的 2 xml 发布了答案
【参考方案1】:
不要将match_parent
高度用于您的回收站视图项目视图。因为一个项目填满了整个屏幕,所以你看不到另一个。
【讨论】:
我不在 layout_weight 中使用 match_parent。我使用 wrap_content @Ariakah : 请检查 recyclerview 列表项 xml。 我已经用我的 2 xml 发布了一个答案【参考方案2】:正如@Mehul Kabaria 所说,问题在于您的项目视图的布局。 pokemon_bank.xml
中的根视图将 layout_width
和 layout_height
设置为 match_parent
。
所以实际上你所有的项目都显示出来了,如果你滚动,你会看到它们在那里。但是每个项目都填满了整个屏幕,看起来好像只显示了一个项目。
将pokemon_bank.xml
中根视图的宽高尺寸改为wrap_content
或固定尺寸。
<androidx.appcompat.widget.LinearLayoutCompat
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical">
<TextView
android:id="@+id/name"
android:layout_
android:layout_
android:padding="10dp"
android:textSize="18sp"
android:text="Pikachu">
</TextView>
<TextView
android:id="@+id/type"
android:layout_
android:layout_
android:gravity="bottom|end"
android:padding="10dp"
android:text="Electrik">
</TextView>
</androidx.appcompat.widget.LinearLayoutCompat>
根据您将 LinearLayoutManager 用于垂直列表还是水平列表,您可以将宽度或设置为match_parent
。
编辑:
此外,您在将模型数据绑定到 RecyclerView 适配器中的项目视图时似乎存在错误:
这里使用静态方法从 MyPokemonBank
类中获取值。
public void display(MyPokemonBank myPokemonBank)
this.mPokemonName.setText(MyPokemonBank.getName());
this.mPokemonType.setText(MyPokemonBank.getType());
相反,他们应该使用参数(小写myPokemonBank
):
public void display(MyPokemonBank myPokemonBank)
this.mPokemonName.setText(myPokemonBank.getName());
this.mPokemonType.setText(myPokemonBank.getType());
【讨论】:
我使用了你的代码,我看到了 3 个项目,但这是 3 上的同一个项目:/ @Ariakah 我更新了我的答案 没有变化。同样的问题:/【参考方案3】:代替这一行:
mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false));
试试这个希望对你有用
mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
【讨论】:
您的代码不起作用。 AS 告诉我这个错误:错误:')' 预期 mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()); 我忘了右括号,请立即尝试 同样的问题,我的 2 TextView 与您的代码不在同一行 在 pokemon_bank.xml 文件中的根布局是什么?你应该使用具有水平方向的LinearLayout,这样它就会在同一个linne中显示你的textview 我已经用我的 2 个 XML 代码发布了答案。我已经更新写“orientation="horizontal" 但同样的问题。只有一项【参考方案4】:这是我的第二个活动 XML:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/home_recyclerview_pokemonname"
android:layout_
android:layout_
android:orientation="vertical">
</androidx.recyclerview.widget.RecyclerView>
和 pokemon_bank.xml
<androidx.appcompat.widget.LinearLayoutCompat
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical">
<TextView
android:id="@+id/name"
android:layout_
android:layout_
android:padding="10dp"
android:textSize="18sp"
android:text="Pikachu">
</TextView>
<TextView
android:id="@+id/type"
android:layout_
android:layout_
android:gravity="bottom|end"
android:padding="10dp"
android:text="Electrik">
</TextView>
</androidx.appcompat.widget.LinearLayoutCompat>
【讨论】:
pokemon_bank.xml 中使用的根布局是什么? 我用根布局编辑我的帖子【参考方案5】:我检查了您的布局代码,问题出在您的 pokemon_bank.xml 中。您需要从 match_parent
更改为 wrap_content
到您的线性布局兼容,这样才能正常工作。
<androidx.appcompat.widget.LinearLayoutCompat
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical">
<TextView
android:id="@+id/name"
android:layout_
android:layout_
android:padding="10dp"
android:textSize="18sp"
android:text="Pikachu">
</TextView>
<TextView
android:id="@+id/type"
android:layout_
android:layout_
android:gravity="bottom|end"
android:padding="10dp"
android:text="Electrik">
</TextView>
</androidx.appcompat.widget.LinearLayoutCompat>
您需要从水平更改为垂直也进入您设置布局管理器的主要活动mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false));
【讨论】:
以上是关于RecyclerView 只显示一项的主要内容,如果未能解决你的问题,请参考以下文章
Android RecyclerView 绘制流程及Recycler缓存