【问题标题】:Cardview is not showing in recyclerviewCardview未显示在recyclerview中
【发布时间】:2017-09-14 15:16:44
【问题描述】:

在我问之前,我可能有一个奇怪的句子,因为我英语说得不好。请事先确认。

我试图通过在片段中放置一个回收视图来显示卡片视图。但是,卡片视图根本不可见。如果您能告诉我问题出在哪里,我将不胜感激。

Home.java

package com.rudolphriding.giftfriend;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
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 java.util.ArrayList;
import java.util.List;

public class Home extends Fragment
{
    private RecyclerView recyclerView;
    private LinearLayoutManager layoutManager;
    private RecyclerAdapter adapter;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
    {
        View hView = inflater.inflate(R.layout.fragment_home, container, false);

        //recyclerview
        recyclerView = (RecyclerView)hView.findViewById(R.id.home_recyclerview);

        initData();

        layoutManager = new LinearLayoutManager(getActivity());
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);

        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(adapter);
        recyclerView.scrollToPosition(0);



        return hView;
    }
/*
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        initData();
    }
*/

    private void initData()
    {
        List<RecyclerItem> items = new ArrayList<>();
        RecyclerItem[] item = new RecyclerItem[2];
        item[0] = new RecyclerItem(R.drawable.rudingworld_start1, "TEST#1", "SUBTEST#1");
        item[1] = new RecyclerItem(R.drawable.rudingworld_start2, "TEST#2", "SUBTEST#2");

        for(int i = 0; i < 2; i++)
        {
            items.add(item[i]);
        }
    }
}

RecyclerAdapter.java

package com.rudolphriding.giftfriend;

import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder>
{
    Context context;
    List<RecyclerItem> items;
    int itemLayout;

    public RecyclerAdapter(Context context, List<RecyclerItem> items, int itemLayout)
    {
        this.context = context;
        this.items = items;
        this.itemLayout = itemLayout;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_trend_cardview, parent, false);
        return new ViewHolder(v);
    }

    //@TargetApi(Build.VERSION_CODES.N)
    @Override
    public void onBindViewHolder(ViewHolder holder, int position)
    {
        final RecyclerItem item = items.get(position);

        holder.image.setImageResource(item.getBackground());
        holder.title.setText(item.getTitle());
        holder.subtitle.setText(item.getSubtitle());

        holder.cardview.setOnClickListener(new View.OnClickListener()
                {
                    @Override
                    public void onClick(View v)
                    {
                    Toast.makeText(context,item.getTitle(),Toast.LENGTH_SHORT).show();
                    }
                }
                );
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        ImageView image;
        TextView title;
        TextView subtitle;
        CardView cardview;

        public ViewHolder(View itemView) {
            super(itemView);

            image = (ImageView)itemView.findViewById(R.id.cardview_image_title);
            title = (TextView)itemView.findViewById(R.id.cardview_text_title);
            subtitle = (TextView)itemView.findViewById(R.id.cardview_text_subtitle) ;
            cardview = (CardView)itemView.findViewById(R.id.cardview);
        }
    }
}

*注释与否没有区别@TargetApi

RecyclerItem.java

public class RecyclerItem
{
    int background;
    String title;
    String subtitle;


    public int getBackground() { return this.background; }

    public String getTitle() { return title; }

    public String getSubtitle() { return subtitle; }



    public RecyclerItem(int background, String title, String subtitle)
    {
        this.background = background;
        this.title = title;
        this.subtitle = subtitle;
    }
}

fragment_home.xml

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

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


    </android.support.v7.widget.RecyclerView>

</RelativeLayout>

item_trend_cardview.xml

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

    <com.rudolphriding.giftfriend.SquareCardView
        android:id="@+id/cardview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:elevation="2dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <ImageView
                android:id="@+id/cardview_image_title"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@drawable/rudingworld_start1"/>


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#80000000"
                android:orientation="vertical"
                android:layout_alignParentBottom="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true">

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

                    <TextView
                        android:id="@+id/cardview_text_title"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:paddingBottom="8dp"
                        android:paddingTop="8dp"
                        android:text="Title goes here"
                        android:textColor="#FFFFFF"
                        android:textSize="24sp"
                        android:textStyle="bold"/>

                    <TextView
                        android:id="@+id/cardview_text_subtitle"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Subtitle here"
                        android:textColor="#FFFFFF"
                        android:textSize="14sp"/>

                </LinearLayout>


                <!--LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:padding="8dp">

                    <Button
                        android:id="@+id/cardview_button_01"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:paddingRight="8dp"
                        android:background="#00000000"
                        android:text="Action1"
                        android:textColor="#FFFFFF"/>

                    <Button
                        android:id="@+id/cardview_button_02"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="#00000000"
                        android:text="Action2"
                        android:textColor="#FFFFFF"/>


                </LinearLayout-->

            </LinearLayout>
        </RelativeLayout>




    </com.rudolphriding.giftfriend.SquareCardView>


</RelativeLayout>

*有自定义的图像视图,可以将方形图像放在卡片视图中。

*我还注释了按钮,因为我还不知道如何让它们出现在卡片视图中。

SquareImageView.java

package com.rudolphriding.giftfriend;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;

public class SquareImageView extends android.support.v7.widget.AppCompatImageView {

    public SquareImageView(Context context) {
        super(context);
    }

    public SquareImageView(Context context, AttributeSet attrs) { super(context, attrs); }

    public SquareImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec);
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);
        int size = width > height ? height : width;
        setMeasuredDimension(size, size); // make it square
    }

}

花了很多天,但我还不知道出了什么问题。欢迎提出任何建议。

【问题讨论】:

  • 如果生成了任何错误/警告日志,请同时发布。了解生成了什么错误或警告非常重要。
  • 您似乎没有将数据分配给适配器。您在initData() 中生成它们,将它们放在一个名为items 的数组中,但不要对这个数组做任何事情。您可能希望将这些项目分配给您的适配器。此外,您似乎从未真正创建过适配器。您只需将适配器(此时为空)分配给回收站视图。
  • @SnehPandya 没有错误消息。谢谢!我会参考下一个问题。
  • @fjc 因为我在学习,我听不懂你在说什么,但谢谢你的热情回复:)
  • 那么请查看下面的答案。他们解决了您的问题。

标签: android android-fragments android-recyclerview android-cardview


【解决方案1】:

您没有创建适配器。试试这个:

    private void initData()
    {
        List<RecyclerItem> items = new ArrayList<>();
        RecyclerItem[] item = new RecyclerItem[2];
        item[0] = new RecyclerItem(R.drawable.rudingworld_start1, "TEST#1", "SUBTEST#1");
        item[1] = new RecyclerItem(R.drawable.rudingworld_start2, "TEST#2", "SUBTEST#2");

        for(int i = 0; i < 2; i++)
        {
            items.add(item[i]);
        }
        adapter= new RecyclerAdapter(getActivity(), items, 
            R.layout.item_trend_cardview);
    }

【讨论】:

  • 感谢您的友好回答!我试过用你告诉我的方法,但还是不行。我会再尝试。 ;(
  • 您的代码的其余部分似乎没问题,也许您的问题出在活动中,您是否正确添加了片段?片段显示了吗?
  • 我的想法完全正确,您可能希望在调试模式下运行代码,并在 Home 片段的 onCreateView() 中设置一个断点,以查看您的程序是否到达那里。
  • 问题解决了!自定义卡片视图是原因。我在 item_trend_cardview 中将 cardview 替换为 costraintlayout 并显示了 initdata。谢谢。
【解决方案2】:

据我所知,您需要初始化适配器并将生成的项目分配给它。现在,您的适配器从未初始化,只是保持null

一个可能的解决方案:

private void initData()
    {
        // ...
        this.adapter = new RecyclerAdapter(getActivity(), items, R.layout.item_trend_cardview); 
    }

更新:将 R.layout.item_trend_cardview 作为实际布局 ID,而不是之前的示例性 0。

【讨论】:

  • 对!感谢你的回复。但它仍然没有固定。我会更加努力的。
猜你喜欢
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多