2015-11-07 91 views
-5

我試圖實現卡片視圖列表,並且列表沒問題,但卡片內的佈局與我在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> 

我用這個RecyclerView XML:

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

    <android.support.v7.widget.RecyclerView 

     android:id="@+id/rvCardFavourite" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     /> 

</LinearLayout> 

這裏是我的CardItem類:

public class FavouriteCardItem { 

    Bitmap animal; 
    int price; 
    String title, race; 

    public FavouriteCardItem(Bitmap animal, int price, String title, String race){ 
     this.animal = animal; 
     this.price = price; 
     this.title = title; 
     this.race = race; 
    } 

    public Bitmap getAnimal() { 
     return animal; 
    } 

    public void setAnimal(Bitmap animal) { 
     this.animal = animal; 
    } 

    public int getPrice() { 
     return price; 
    } 

    public void setPrice(int price) { 
     this.price = price; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public String getRace() { 
     return race; 
    } 

    public void setRace(String race) { 
     this.race = race; 
    } 
} 

這裏是我打電話給我的適配器和設置數據適配器:

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); 
    } 

這是我的適配器類:

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); 
     } 
    } 
} 

BTW我知道我不應該加載這樣的圖像等,但我只是想創造一些測試數據得到的佈局之前,我開始加載來自在線數據存儲的數據。

下面是整個卡片視圖的樣子。它應該有3個textViews和1個ImageView的,但它只能說明一個ImageView的.....

enter image description here

+0

改變寬度和ImageView的(ivCardFavouriteAnimalPhoto)的高度從包裹內容... 150dp然後你就會明白,而只有ImageView的情況下才會顯示 –

+0

因爲150dp是支持多屏幕尺寸? –

+0

我的觀點是圖像視圖消耗了大部分空間,因此沒有剩餘空間用於textview .... Infact即使您在相對佈局中刪除了8dp的填充,圖像也會觸摸卡邊界...您可以檢查它。 –

回答

1

你可以試試這是解決方案之一,如果你不想指定圖像

<?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,它將使用文本以2:1的比例在ImageView和RelativeLayout之間分配屏幕寬度。
此外,我已經減少從30sp文字的大小20SP

0

試着讓你的卡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>