【问题标题】:Android - Why RecyclerView is not displaying on the device?Android - 为什么 RecyclerView 没有显示在设备上?
【发布时间】:2019-07-25 23:25:24
【问题描述】:

我刚刚创建了一个简单的RecyclerView 项目,它将显示水果的名称。但是当我运行该文件时,它没有显示任何内容。事实上我的整个源代码都很好。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

MainActivity.java

package com.fruits.myrecyclerview;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    String[] fruits = {"Apple", "Mango", "Pineapple", "Orange"};
    FruitsAdapter fruitsAdapter;
    RecyclerView recyclerView;

    @Override
    protected void onCreate( Bundle savedInstanceState ) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );
        fruitsAdapter = new FruitsAdapter( fruits );
        recyclerView = findViewById( R.id.recycler_view );
        recyclerView.setAdapter( fruitsAdapter );
    }
}

FruitsAdapter.java

package com.fruits.myrecyclerview;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

public class FruitsAdapter extends RecyclerView.Adapter<FruitsAdapter.FruitsView>{
    String[] fruits;

    public FruitsAdapter( String[] fruits){
        this.fruits = fruits;
    }

    public class FruitsView extends RecyclerView.ViewHolder{
        TextView textView;
        public FruitsView( View view ){
            super(view);
            textView = (TextView) view.findViewById( R.id.fruit_list );
        }

    }
    @Override
    public FruitsView onCreateViewHolder( @NonNull ViewGroup parent, int viewType ) {
        LinearLayout linearLayout = (LinearLayout) LayoutInflater
                .from( parent.getContext() )
                .inflate( R.layout.fruites_list, parent, false );
        return new FruitsView( linearLayout );
    }

    @Override
    public void onBindViewHolder( @NonNull FruitsView holder, int position ) {
        holder.textView.setText( fruits[position] );
    }

    @Override
    public int getItemCount( ) {
        return fruits.length;
    }
}

fruites_list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/linear_layout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/fruit_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:textSize="30dp"
        android:gravity="center"
        android:text="Something"
        android:textColor="@android:color/holo_blue_dark"/>

</LinearLayout>

【问题讨论】:

    标签: android android-recyclerview android-adapter android-viewholder android-adapterview


    【解决方案1】:

    您缺少 LayoutManager,添加

    recyclerview.setLayoutManager(new LinearLayoutManager(getContext()));
    

    【讨论】:

    • 它告诉 RecyclerView 如何布局它的元素。没有它,什么都不会显示。这个将项目放置在一个垂直列中。您可以将它们水平放置,或者对多列使用 GridLayout 管理器。
    • 这是什么意思?但是我已经添加了视图持有者,那么为什么要添加layout manager?你能给我一个例子来清除这个逻辑吗?
    • recyclerview 是一个模块化组件,它将职责卸载到其他组件。其中之一是 LayoutManager,它计算如何定位元素。除非您给 RecyclerView 一个 LayoutManager(提供的 3 个之一或您自己的),否则不会显示任何内容,因为 RecyclerView 本身不知道如何在屏幕上放置项目。查看 RecyclerView 文档了解更多详情。
    • 还有一件事,RecyclerView 会在内部自动优化项目列表还是不需要我做一些特别的事情?
    • 我不确定您所说的“优化”是什么意思,但如果您的意思是回收物品并在它们从屏幕上流出时重新使用它们,那么是的,它就是这样做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多