2016-11-10 322 views
10

RecyclerView重疊我想開發這樣的畫面沒有陰影

enter image description here

我已經習慣RecylerView ItemDecorator的重疊列表。但它沒有陰影重疊。屏幕&裝飾代碼如下

enter image description here

public class OverlapDecoration extends RecyclerView.ItemDecoration { 

private final static int vertOverlap = -50; 

@Override 
public void getItemOffsets (Rect outRect, View view, RecyclerView parent,  RecyclerView.State state) { 

outRect.set(0, 0, 0, vertOverlap); 
} 
} 

card_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical" 
android:tag="cards main container"> 

<android.support.v7.widget.CardView 
    android:id="@+id/card_view" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    card_view:cardBackgroundColor="@color/color_white" 
    card_view:cardElevation="5dp" 
    card_view:cardUseCompatPadding="true"> 

      <TextView 
       android:id="@+id/textViewName" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_horizontal" 
       android:layout_marginTop="30dp" 
       android:layout_marginBottom="30dp" 
       android:text="Android Name" 
       android:textAppearance="?android:attr/textAppearanceLarge"/> 

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

</LinearLayout> 
+0

我不確定這將如何滿足您的需要,但如果您在recyclerview項目中使用cardviews,請嘗試使用提升屬性並嘗試。 – Raghavendra

+0

我使用擡高「card_layout.xml」。請檢查上面修改的問題。 – Elango

+0

使用卡片視圖,而不是項目的裝飾和卡之間的管理空間。 – Radhey

回答

6

enter image description here試試這個代碼

card_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:tag="cards main container"> 

    <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/card_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="0dp" 
     android:clipToPadding="false" 
     android:elevation="0dp" 
     card_view:cardUseCompatPadding="false" 
     card_view:paddingEnd="0dp" 
     card_view:paddingStart="0dp"> 

     <TextView 
      android:id="@+id/textViewName" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="30dp" 
      android:layout_marginTop="30dp" 
      android:gravity="center" 
      android:text="Android Name" 
      android:textAppearance="?android:attr/textAppearanceLarge" /> 

     <TextView 
      android:id="@+id/textView2" 
      android:layout_width="match_parent" 
      android:layout_height="30dp" 
      android:layout_above="@id/textViewName" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true" 
      android:layout_alignParentTop="true" 
      android:background="@drawable/card_shadow" /> 
    </android.support.v7.widget.CardView> 


</RelativeLayout> 

卡片陰影 card_shadow

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <gradient 
     android:angle="90" 
     android:endColor="#77111111" 
     android:startColor="@android:color/transparent" /> 
</shape> 
4

這就是比如你的問題的解決方案的靜態CardView,在這裏,你每次通過2DP或5DP減少您card_view:cardElevation。但是,如果你有recyclerview做到了這一點,並希望將動態CardView,那麼你必須在你的RecyclerView Adapter添加海拔動態。隨着其地位的增加而下降。 Set card elevation holder.cardView.setCardElevation()

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:tag="cards main container"> 

<android.support.v7.widget.CardView 
    android:id="@+id/card_view" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    card_view:cardElevation="20dp" 
    card_view:cardUseCompatPadding="false"> 

    <TextView 
     android:id="@+id/textViewName1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:layout_marginTop="30dp" 
     android:layout_marginBottom="30dp" 
     android:text="Android Name" 
     android:textAppearance="?android:attr/textAppearanceLarge"/> 

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

<android.support.v7.widget.CardView 
    android:id="@+id/card_view2" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    card_view:cardElevation="18dp" 
    card_view:cardUseCompatPadding="false"> 

    <TextView 
     android:id="@+id/textViewName" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:layout_marginTop="30dp" 
     android:layout_marginBottom="30dp" 
     android:text="Android Name" 
     android:textAppearance="?android:attr/textAppearanceLarge"/> 

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

<android.support.v7.widget.CardView 
    android:id="@+id/card_view3" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    card_view:cardUseCompatPadding="false"> 

    <TextView 
     android:id="@+id/textViewName3" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:layout_marginTop="30dp" 
     android:layout_marginBottom="30dp" 
     android:text="Android Name" 
     android:textAppearance="?android:attr/textAppearanceLarge"/> 

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

</LinearLayout> 

希望它能幫助你。謝謝。

4

試試這個。

在RecyclerView適配器 - 上OnBindViewHolder方法添加以下代碼:

CardView cardView = ((MyViewHolder) holder).cardView; 
    float elevation = cardView.getCardElevation(); 
    float value = elevation-Float.parseFloat((position*0.5)+""); 
    cardView.setCardElevation(value); 

看到輸出here

注:取決於你的代碼修改上面的代碼,並在正確的地方使用它。

僅供參考這裏是我的樣本適配器代碼。

public class CustomAdapter extends RecyclerView.Adapter { 
     public static final String Name = "Name"; 
     public static final String Author = "Author"; 
     public static final String Description = "Description"; 
     private List<Book> dataSet; 
     private Context context; 


     public CustomAdapter(List<Book> data, Context context) { 
      this.dataSet = data; 
      this.context = context; 
     } 

     public class MyViewHolder extends RecyclerView.ViewHolder { 
      ImageView profile; 
      TextView name, author,description; 
      CardView cardView; 

      public MyViewHolder(View itemView) { 
       super(itemView); 
       profile = (ImageView) itemView.findViewById(R.id.profile_image); 
       name = (TextView) itemView.findViewById(R.id.name); 
       author = (TextView) itemView.findViewById(R.id.author); 
       description = (TextView) itemView.findViewById(R.id.description); 
       cardView = (CardView) itemView.findViewById(R.id.cardview); 
      } 
     } 

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

     @Override 
     public int getItemViewType(int position) { 
      return position; 
     } 

     @Override 
     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      RecyclerView.ViewHolder vh; 
      View v = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.book_layout_sample, parent, false); 

      vh = new MyViewHolder(v); 
      return vh; 
     } 

     @Override 
     public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
      if (holder instanceof MyViewHolder) { 
       Book book = dataSet.get(position); 
       ((MyViewHolder) holder).profile.setImageDrawable(getResources().getDrawable(R.drawable.blank_user,this.context.getTheme())); 
       ((MyViewHolder) holder).name.setText(book.title); 
       ((MyViewHolder) holder).author.setText(book.author); 
       ((MyViewHolder) holder).description.setText(book.description); 
       CardView cardView = ((MyViewHolder) holder).cardView; 
       float ele = cardView.getCardElevation(); 
       float val = ele-Float.parseFloat((position*0.5)+""); 
       cardView.setCardElevation(val); 

       if(position==0) 
       { 
        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams)cardView.getLayoutParams(); 
        params.setMargins(0,0,0,0); 
        cardView.setLayoutParams(params); 
       } 
      } 
     } 
    }