Android基礎---值得記住的小地方

string.xml中數組的創建

  <string-array name="transitions">
        <item>Fade</item>
        <item>Slide</item>
        <item>Explode</item>
    </string-array>
  • Activity中的調用 
    String[] Array = getResources().getStringArray(R.array.transitions);

getPosition \ getLayoutPosition \ getAdapterPosition

  • getPosition(); 查閱資料後發現[已棄用]
  • getLayoutPosition(); [條目在最新佈局計算中的位置]
  • getAdapterPosition(); [條目在是適配器中的位置]

getLayoutPosition vs getAdapterPosition

這兩種類型的位置是等同的,除非在分發adapter.notify*事件和更新佈局時。

adapter和layout的位置會有時間差(<16ms), 如果你改變了Adapter的數據然後刷新視圖, layout需要過一段時間纔會更新視圖, 在這段時間裏面, 這兩個方法返回的position會不一樣.

在notifyDataSetChanged之後並不能馬上獲取Adapter中的position, 要等佈局結束之後才能獲取到.

而對於Layout的position, 在notifyItemInserted之後, Layout不能馬上獲取到新的position, 因爲佈局還沒更新(需要<16ms的時間刷新視圖), 所以只能獲取到舊的, 但是Adapter中的position就可以馬上獲取到最新的position.

返回佈局位置的方法使用最近一次佈局運算後的位置,如getLayoutPosition()findViewHolderForLayoutPosition(int)。這些位置包含了最近一次佈局運算後的變化。你可以根據這些位置來與用戶正在屏幕上看到的保持一致。比如,你有一個條目列表,當用戶請求第5個條目時,你可以使用這些方法來匹配用戶看到的。

另外一系列方法與AdapterPosition關聯,比如getAdapterPosition()findViewHolderForAdapterPosition(int)。當你想獲得條目在更新後的適配器中的位置使用這些方法,即使這些位置變化還沒反映到佈局中。比如,你想訪問適配器中條目的位置時,就應該使用getAdapterPosition()。注意,如果notifyDataSetChanged()已經被調用而且還沒計算新佈局,這些方法或許不能夠計算適配器位置。所以,你要小心處理這些方法返回NO_POSITION和null的情況。

總之,當使用RecycleView.LayoutManager時使用佈局位置。與此同時,使用RecycleView.Adapter時,使用適配器位置。

RecyclerView.ViewHolder - getLayoutPosition vs getAdapterPosition

AnimatedVectorDrawable

<vector>元素的矢量資源,在res/drawable/(文件夾)

<animated-vector>元素的矢量資源動畫,在res/drawable/(文件夾)

< objectAnimator>元素的一個或多個對象動畫器,在res/anim/(文件夾)

矢量資源動畫能創建<group><path>元素屬性的動畫。<group>元素定義了一組路徑或子組,並且<path>元素定義了要被繪製的路徑。

例子

<span style="font-size:18px;"><animated-vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_remove">
    <target
        android:name="@string/remove"
        android:animation="@animator/remove_to_add" />
    <target
        android:name="@string/groupAddRemove"
        android:animation="@animator/rotate_remove_to_add" />
</animated-vector></span>

  • ic_remove.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <vector xmlns:android="http://schemas.android.com/apk/res/android"
            android:width="@dimen/add_remove_width"
            android:height="@dimen/add_remove_height"
            android:viewportHeight="@integer/add_remove_viewport_height"
            android:viewportWidth="@integer/add_remove_viewport_width">
        <group
            android:name="@string/groupAddRemove"
            android:pivotX="@integer/add_remove_pivot_x"
            android:pivotY="@integer/add_remove_pivot_y">
            <path
                android:fillColor="@color/add_remove_stroke_color"
                android:pathData="@string/path_remove"/>
        </group>
    </vector>
  • mAddToRemoveDrawable = (AnimatedVectorDrawable) getDrawable(R.drawable.avd_add_to_remove);
  • mRemoveToAddDrawable = (AnimatedVectorDrawable) getDrawable(R.drawable.avd_remove_to_add);
    AnimatedVectorDrawable drawable =
                    mIsAddState ? mRemoveToAddDrawable : mAddToRemoveDrawable;
            mAddRemoveImage.setImageDrawable(drawable);
            drawable.start();

發佈了456 篇原創文章 · 獲贊 19 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章