2017-04-19 115 views
0

我想做這樣的列表視圖。我想要的是當用戶觸摸第一個項目時,第二個項目行出現。當用戶觸摸第三行項目時,以前的項目會再次自動隱藏。我怎樣才能實現這個,而不是使用可擴展的列表視圖?指導我實現這一目標。提前致謝。顯示和隱藏列表視圖

回答

0

對不起,我有點忙,所以我現在不能寫代碼。但下面是你可以用來獲得你想要的方式。當我將獲得時間時,我會添加代碼。

  1. 有一個參數名「機器人:animateayoutchanges」,將其應用到您的視圖的父,這將是可見和不可見。
  2. 保存您點擊並展開的項目的位置。
  3. 當您單擊該項目時,將視圖的可見性設置爲可見。
  4. 當你再次點擊該物品位置時,將該物品的可見性設置爲消失。
  5. 當您單擊某個其他項目時,將存儲的項目位置的可見性設置爲消失,將當前選定項目的可見性設置爲可見並將其存儲到位置。 就是這樣。

安卓animateayoutchanges使用,這樣當你設定的能見度可見或消失,並享有向上或向下移動,那麼這個運動將有流暢的動畫效果。

我會稍後用代碼更新我的答案但您會從上述步驟中獲得一個主意。

UPDATE

public class ShippingAdapter extends RecyclerView.Adapter<ShippingAdapter.ViewHolder> { 

    private ArrayList<ShippingOptions> list; 
    private int expandedPosition = -1; 
    private int listSize = 0; 
    private int checkedPositon = -1; 
    private String currency; 

    public ShippingAdapter(ArrayList<ShippingOptions> list, String currency, AdapterInterface listener) { 
     this.list = list; 
     listSize = list.size(); 
     this.currency = currency; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     // create a new view 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_shipping_options, parent, false); 
     // Layout in which you will add **android:animatelayoutchanges** 
     return new ViewHolder(v); 
    } 


    @Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 
     ShippingOptions item = list.get(position); 
     holder.name.setText(item.getName()); 
     holder.fee.setText(utils.getFormattedCurrency(currency, Double.parseDouble(item.getShippingFee()))); 
     holder.description.setText(item.getDescription()); 
     holder.deliveryTime.setText(item.getDeliveryTime()); 
     if (listSize == 1) { 
      list.get(position).setExpanded(true); 
     } 


     **if (list.get(position).isExpanded()) { 
      holder.expandableView.setVisibility(View.VISIBLE); 
      holder.checkBox.setVisibility(View.VISIBLE); 
      if (checkedPositon == position) { 
       holder.checkBox.setChecked(true); 
      } else { 
       holder.checkBox.setChecked(false); 
      } 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
       holder.parent.setElevation(12); 
       holder.parent.setTranslationZ(6); 
       holder.parent.setClipToPadding(false); 
       holder.parent.setClipToOutline(false); 
      } 
     } else { 
      holder.expandableView.setVisibility(View.GONE); 
      holder.checkBox.setVisibility(View.GONE); 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
       holder.parent.setElevation(0); 
       holder.parent.setTranslationZ(0); 
      } 
     }** 

     **holder.parent.setOnClickListener(new View.OnClickListener() { 
      @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) 
      @Override 
      public void onClick(View v) { 
       if (listSize > 1) { 
        if (expandedPosition == position) { 
         if (list.get(position).isExpanded()) { 
          list.get(position).setExpanded(false); 
         } else { 
          list.get(position).setExpanded(true); 
         } 
         notifyItemChanged(position); 
        } else { 
         if (expandedPosition >= 0) { 
          list.get(expandedPosition).setExpanded(false); 
          notifyItemChanged(expandedPosition); 
         } 
         expandedPosition = position; 
         list.get(expandedPosition).setExpanded(true); 
         notifyItemChanged(expandedPosition); 
        } 
       } 
      } 
     });** 


    } 

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

    public class ViewHolder extends RecyclerView.ViewHolder { 
     // each data item is just a string in this case 
     public TextView name, fee, description, deliveryTime; 
     public LinearLayout parent, expandableView; 
     public CheckBox checkBox; 

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

      name = (TextView) v.findViewById(R.id.tv_shipping_name); 
      fee = (TextView) v.findViewById(R.id.tv_shipping_fee); 
      description = (TextView) v.findViewById(R.id.tv_description); 
      deliveryTime = (TextView) v.findViewById(R.id.tv_delivery_time); 
      parent = (LinearLayout) v.findViewById(R.id.parent); 
      expandableView = (LinearLayout) v.findViewById(R.id.expandable_view); 
      checkBox = (CheckBox) v.findViewById(R.id.checkbox); 

     } 


    } 
} 

list_shipping_options.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/parent" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:animateLayoutChanges="true" 
    android:background="@color/white" 
    android:orientation="vertical" 
    android:padding="10dp"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="?listPreferredItemHeightSmall" 
     android:gravity="center_vertical"> 

     <TextView 
      android:id="@+id/tv_shipping_name" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textAppearance="@style/text_medium" 
      android:textColor="@color/colorPrimary" /> 

     <CheckBox 
      android:id="@+id/checkbox" 
      android:layout_width="35dp" 
      android:layout_height="35dp" 
      android:layout_alignParentEnd="true" 
      android:background="?android:attr/listChoiceIndicatorMultiple" 
      android:button="@null" 
      android:checked="false" 
      android:visibility="visible" /> 
    </RelativeLayout> 

    <LinearLayout 
     android:id="@+id/expandable_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:visibility="visible"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:paddingBottom="10dp" 
      android:paddingTop="10dp"> 

      <TextView 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_weight="1" 
       android:text="@string/label_shipping_fee" /> 

      <TextView 
       android:id="@+id/tv_shipping_fee" 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_weight="2" /> 
     </LinearLayout> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:paddingBottom="10dp" 
      android:paddingTop="10dp"> 

      <TextView 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_weight="1" 
       android:text="@string/lable_description" /> 

      <TextView 
       android:id="@+id/tv_description" 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_weight="2" /> 
     </LinearLayout> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:paddingBottom="10dp" 
      android:paddingTop="10dp"> 

      <TextView 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_weight="1" 
       android:text="@string/delivery_time" /> 

      <TextView 
       android:id="@+id/tv_delivery_time" 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_weight="2" /> 
     </LinearLayout> 
    </LinearLayout> 

</LinearLayout> 

ShippingOptions.class

public class ShippingOptions implements Serializable { 

    private String id; 
    private String name; 
    private String shippingFee; 
    private String description; 
    private String deliveryTime; 
    private boolean isExpanded; 
    private boolean isChecked; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getShippingFee() { 
     return shippingFee; 
    } 

    public void setShippingFee(String shippingFee) { 
     this.shippingFee = shippingFee; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public String getDeliveryTime() { 
     return deliveryTime; 
    } 

    public void setDeliveryTime(String deliveryTime) { 
     this.deliveryTime = deliveryTime; 
    } 

    public boolean isExpanded() { 
     return isExpanded; 
    } 

    public void setExpanded(boolean expanded) { 
     isExpanded = expanded; 
    } 

    public boolean isChecked() { 
     return isChecked; 
    } 

    public void setChecked(boolean checked) { 
     isChecked = checked; 
    } 
} 
+0

你的意思是更新的部份paramete r on activity xml?「android:animateayoutchanges」 – Let

+0

是的,在列表項的佈局中添加此參數並將其設置爲true –

+0

如何執行步驟2?您通過保存項目位置意味着什麼? – Let