Java 卡布局参数不工作
我试图实现一个卡片视图列表,该列表很好,但是卡片内部的布局与我在XML中定义的完全不同。你知道为什么没有正确显示吗?这是我的卡片XML: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 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>