Java 卡布局参数不工作

Java 卡布局参数不工作,java,android,xml,Java,Android,Xml,我试图实现一个卡片视图列表,该列表很好,但是卡片内部的布局与我在XML中定义的完全不同。你知道为什么没有正确显示吗?这是我的卡片XML: <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView android:id="@+id/cvAdvertFavourite" xmlns:android="http://schemas.android.com/apk/res/and

我试图实现一个卡片视图列表,该列表很好,但是卡片内部的布局与我在XML中定义的完全不同。你知道为什么没有正确显示吗?这是我的卡片XML:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    android:id="@+id/cvAdvertFavourite"
    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"
    android:layout_marginTop="2dip"
    android:layout_marginBottom="2dip"
    card_view:cardUseCompatPadding="true"
    >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="8dp"
        >

        <ImageView
            android:id="@+id/ivCardFavouriteAnimalPhoto"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_marginRight="8dp"
            />

        <TextView
            android:id="@+id/tvCardFavouriteTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_toRightOf="@+id/ivCardFavouriteAnimalPhoto"
            android:textSize="30sp"
            />

        <TextView
            android:id="@+id/tvCardFavouriteRace"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/tvCardFavouriteTitle"
            android:layout_toRightOf="@+id/ivCardFavouriteAnimalPhoto"
            />

        <TextView
            android:id="@+id/tvCardFavouritePrice"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/tvCardFavouriteRace"
            android:layout_toRightOf="@+id/ivCardFavouriteAnimalPhoto"
            />

    </RelativeLayout>

</android.support.v7.widget.CardView>
以下是我如何调用适配器并设置适配器的数据:

private void loadSetData() {
        List<FavouriteCardItem> items = new ArrayList<FavouriteCardItem>();
        Bitmap bitmap = BitmapFactory.decodeResource(getActivity().getResources(),
                R.drawable.bird);
        FavouriteCardItem item1 = new FavouriteCardItem(bitmap, 100, "birds", "birds");
        items.add(item1);
        Bitmap bitmap2 = BitmapFactory.decodeResource(getActivity().getResources(),
                R.drawable.dog);
        FavouriteCardItem item2 = new FavouriteCardItem(bitmap2, 200, "dogs", "dogs");
        items.add(item2);
        Bitmap bitmap3 = BitmapFactory.decodeResource(getActivity().getResources(),
                R.drawable.cat);
        FavouriteCardItem item3 = new FavouriteCardItem(bitmap3, 1000, "cats", "cats");
        items.add(item3);

        FavouriteCardAdapter adapter = new FavouriteCardAdapter(getActivity(), R.layout.card_view, items);
        recyclerView.setAdapter(adapter);
    }
private void loadSetData(){
列表项=新建ArrayList();
位图位图=BitmapFactory.decodeResource(getActivity().getResources(),
R.可牵引的鸟);
FavoriteCardItem1=新的FavoriteCardItem(位图,100,“鸟”,“鸟”);
增加(第1项);
位图bitmap2=BitmapFactory.decodeResource(getActivity().getResources(),
R.可牵引狗);
FavoriteCardItem2=新的FavoriteCardItem(位图2200,“狗”,“狗”);
增加(第2项);
位图bitmap3=BitmapFactory.decodeResource(getActivity().getResources(),
R.drawable.cat);
FavoriteCardItem3=新的FavoriteCardItem(位图3,1000,“猫”,“猫”);
增加(第3项);
FavoriteCardAdapter=新的FavoriteCardAdapter(getActivity(),R.layout.card_视图,items);
recyclerView.setAdapter(适配器);
}
这是我的适配器类:

public class FavouriteCardAdapter extends RecyclerView.Adapter<FavouriteCardAdapter.CardViewHolder> {

    private Context mContext;
    private int resourceId;
    List<FavouriteCardItem> cardItems;

    public FavouriteCardAdapter(Context context, int resource, List<FavouriteCardItem> cardItems){
        mContext = context;
        resourceId = resource;
        this.cardItems = cardItems;
    }


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

    @Override
    public void onBindViewHolder(CardViewHolder holder, int position) {
        DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
        int screenHeight = metrics.heightPixels;

        holder.cardView.getLayoutParams().height = screenHeight / 4;
        int price = cardItems.get(position).getPrice();
        String price1 = Integer.toString(price);
        holder.tvPrice.setText(price1);
        holder.tvRace.setText(cardItems.get(position).getRace());
        holder.tvTitle.setText(cardItems.get(position).getTitle());
        holder.ivAnimal.setImageBitmap(cardItems.get(position).getAnimal());
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

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

    public class CardViewHolder extends RecyclerView.ViewHolder{

        CardView cardView;
        ImageView ivAnimal;
        TextView tvPrice, tvTitle, tvRace;

        public CardViewHolder(View itemView) {
            super(itemView);
            cardView = (CardView) itemView.findViewById(R.id.cvAdvertFavourite);
            ivAnimal = (ImageView) itemView.findViewById(R.id.ivCardFavouriteAnimalPhoto);
            tvPrice = (TextView) itemView.findViewById(R.id.tvCardFavouritePrice);
            tvTitle = (TextView) itemView.findViewById(R.id.tvCardFavouriteTitle);
            tvRace = (TextView) itemView.findViewById(R.id.tvCardFavouriteRace);
        }
    }
}
公共类FavoriteCardAdapter扩展了RecyclerView.Adapter{
私有上下文;
私有资源ID;
列表项目;
公共收藏夹CardAdapter(上下文上下文、int资源、列表cardItems){
mContext=上下文;
resourceId=资源;
this.cardItems=cardItems;
}
@凌驾
公共卡ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.card_视图,parent,false);
CardViewHolder cvh=新的万向节收视器(v);
返回cvh;
}
@凌驾
BindViewHolder上的公共无效(CardViewHolder,内部位置){
DisplayMetrics=Resources.getSystem().getDisplayMetrics();
int屏幕高度=metrics.heightPixels;
holder.cardView.getLayoutParams().height=屏幕高度/4;
int price=cardItems.get(position.getPrice();
字符串price1=Integer.toString(价格);
holder.tvPrice.setText(price1);
holder.tvreace.setText(cardItems.get(position.getRace());
holder.tvTitle.setText(cardItems.get(position.getTitle());
holder.ivAnimal.setImageBitmap(cardItems.get(position.getAnimal());
}
@凌驾
附加ToRecyclerView(RecyclerView RecyclerView)上的公共无效{
super.onAttachedToRecyclerView(recyclerView);
}
@凌驾
public int getItemCount(){
返回cardItems.size();
}
公共类CardViewHolder扩展了RecyclerView.ViewHolder{
卡德维尤;
ImageView ivAnimal;
TextView tvPrice、tvTitle、tvRace;
公共名片夹(查看项目视图){
超级(项目视图);
cardView=(cardView)itemView.findViewById(R.id.cvd);
ivAnimal=(ImageView)itemView.findViewById(R.id.ivcardFavoriteAnimalPhoto);
tvPrice=(TextView)itemView.findViewById(R.id.TVcardFavoritePrice);
tvTitle=(TextView)itemView.findViewById(R.id.TvCardFavoriteTTitle);
tvRace=(TextView)itemView.findViewById(R.id.TvCardFavoriteRace);
}
}
}
顺便说一句,我知道我不应该像这样加载图像等等,但我只是想创建一些测试数据,以便在我开始从在线数据存储加载数据之前获得正确的布局

下面是整个卡片视图的外观。它应该有3个文本视图和1个图像视图,但它只显示一个图像视图


尝试使您的卡xml如下所示:

<android.support.v7.widget.CardView
android:id="@+id/cvAdvertFavourite"
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"
android:layout_marginTop="2dip"
android:layout_marginBottom="2dip"
card_view:cardUseCompatPadding="true"
>
<RelativeLayout
        android:id="@+id/something"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        >

        <ImageView
            android:id="@+id/ivCardFavouriteAnimalPhoto"
            android:layout_width="@dimen/your_size_of_image" // the important part
            android:layout_height="@dimen/your_size_of_image" // the important part
            android:layout_centerVertical="true"
            android:scaleType="centerCrop"/>

        <LinearLayout // make sure you are using a linearlyout 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toEndOf="@id/ivCardFavouriteAnimalPhoto"
            android:layout_toRightOf="@id/ivCardFavouriteAnimalPhoto"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tvCardFavouriteTitle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" />

             <TextView
                android:id="@+id/tvCardFavouriteRace"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" />

              <TextView
                android:id="@+id/tvCardFavouritePrice"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" />

        </LinearLayout>

    </RelativeLayout>
    </android.support.v7.widget.CardView>

如果不想为图像的宽度和高度指定尺寸,可以尝试将此作为解决方案之一

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    android:id="@+id/cvAdvertFavourite"
    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"
    android:layout_marginTop="2dip"
    android:layout_marginBottom="2dip"
    card_view:cardUseCompatPadding="true"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:padding="8dp"
        >

        <ImageView
            android:id="@+id/ivCardFavouriteAnimalPhoto"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="8dp"
            android:weight = "2"/>

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:weight = "1" />

        <TextView
            android:id="@+id/tvCardFavouriteTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:textSize="20sp"
            />

        <TextView
            android:id="@+id/tvCardFavouriteRace"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/tvCardFavouriteTitle"
            />

        <TextView
            android:id="@+id/tvCardFavouritePrice"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/tvCardFavouriteRace"
            />
      </RelativeLayout>
    </LinearLayout>

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

在本文中,我使用了LinearLayout,它将在ImageView和RelativeLayout与文本之间以2:1的比例分配屏幕宽度。

此外,我还将文本大小从30sp减小到20sp

更改图像视图的宽度和高度(IVCardFavoriteAnimalPhoto)从包装内容到150dp…然后你就会明白,只有imageview才是可见的,因为150dp支持多种屏幕尺寸?我的观点是,图像视图占用了大部分空间,因此没有空间留给textview…事实上,即使你删除相对布局中8dp的填充,图像也会触及卡边界…你可以我明白你的意思。因此,我还应该通过编程设置图像大小,以确保它只占卡片宽度的三分之一,就像一个例子一样?请尝试使用我发布的答案
<android.support.v7.widget.CardView
android:id="@+id/cvAdvertFavourite"
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"
android:layout_marginTop="2dip"
android:layout_marginBottom="2dip"
card_view:cardUseCompatPadding="true"
>
<RelativeLayout
        android:id="@+id/something"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        >

        <ImageView
            android:id="@+id/ivCardFavouriteAnimalPhoto"
            android:layout_width="@dimen/your_size_of_image" // the important part
            android:layout_height="@dimen/your_size_of_image" // the important part
            android:layout_centerVertical="true"
            android:scaleType="centerCrop"/>

        <LinearLayout // make sure you are using a linearlyout 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toEndOf="@id/ivCardFavouriteAnimalPhoto"
            android:layout_toRightOf="@id/ivCardFavouriteAnimalPhoto"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tvCardFavouriteTitle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" />

             <TextView
                android:id="@+id/tvCardFavouriteRace"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" />

              <TextView
                android:id="@+id/tvCardFavouritePrice"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" />

        </LinearLayout>

    </RelativeLayout>
    </android.support.v7.widget.CardView>
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    android:id="@+id/cvAdvertFavourite"
    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"
    android:layout_marginTop="2dip"
    android:layout_marginBottom="2dip"
    card_view:cardUseCompatPadding="true"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:padding="8dp"
        >

        <ImageView
            android:id="@+id/ivCardFavouriteAnimalPhoto"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="8dp"
            android:weight = "2"/>

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:weight = "1" />

        <TextView
            android:id="@+id/tvCardFavouriteTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:textSize="20sp"
            />

        <TextView
            android:id="@+id/tvCardFavouriteRace"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/tvCardFavouriteTitle"
            />

        <TextView
            android:id="@+id/tvCardFavouritePrice"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/tvCardFavouriteRace"
            />
      </RelativeLayout>
    </LinearLayout>

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