RecycleView仅显示第一个项目

moo*_*y16 36 android

问题在于:我在世界上创建了最简单的RecyclerView,但它只显示了第一个项目.我不明白为什么.谢谢你的帮助.

item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/tv_detail"/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.bcit.moonlady.testrecycler.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:id="@+id/tv_hello"/>

   <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:id="@+id/rv_details"
        android:layout_below="@+id/tv_hello"/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

MainActivity.java

package com.bcit.moonlady.testrecycler;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    String[] data = {"test1", "test2", "test3"};

    RecyclerView mRecView;

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

        mRecView = (RecyclerView)findViewById(R.id.rv_details);
        mRecView.setHasFixedSize(true);
        mRecView.setLayoutManager(new    LinearLayoutManager(getApplicationContext()));
        mRecView.setAdapter(new DetailAdapter());
   }

   private class DetailView extends RecyclerView.ViewHolder {
        TextView mTextView;

        public DetailView(View itemView) {
            super(itemView);
            mTextView = (TextView)itemView.findViewById(R.id.tv_detail);
        }

        public void bindView(String string) {
            mTextView.setText(string);
        }
   }

   private class DetailAdapter extends RecyclerView.Adapter<DetailView> {
       @Override
       public DetailView onCreateViewHolder(ViewGroup parent, int viewType)          {
            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
            View v = layoutInflater.inflate(R.layout.item_layout, parent, false);
            return new DetailView(v);
       }

       @Override
       public void onBindViewHolder(DetailView holder, int position) {
           String string = data[position];
           holder.bindView(string);
       }

       @Override
       public int getItemCount() {
           return data.length;
       }
   } 
}
Run Code Online (Sandbox Code Playgroud)

ram*_*mji 119

如果您使用的是Android支持库v 23.2.0及更高版本,则需要将item_layout高度更改为wrap_content

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/tv_detail"/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

  • 补充@Ramji的响应,如果在RecycleView中插入的项目是父级大小的,则RecycleView算法将永远不会插入其他元素,因为RecycleView仅在用户向上滚动时添加新元素。如果假设元素正在 ui 中显示,则 RecycleView 逻辑仅将元素添加到屏幕 (2认同)

Pri*_*jan 12

我也犯了这个常见的错误.只需更改您的父级LinearLayout - 高度应为"wrap_content"

<LinearLayout
android:layout_width="match_parent"
android:layout_height = "wrap_content"
..... >
..
..
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)


小智 6

当 RecyclerView 包裹在 ScrollView 中时,我遇到了同样的问题。您应该使用 NestedScrollView 代替。

    <android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

          <!-- other content -->

                <android.support.v7.widget.RecyclerView
                    android:id="@+id/my_recycler"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"/>
        </LinearLayout>

 </android.support.v4.widget.NestedScrollView>
Run Code Online (Sandbox Code Playgroud)


小智 5

将高度设置为item_layout.xml中RelativeLayout的wrap_content。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/tv_detail"/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)