こゆのあったんだわ!

オプションの選択とかの金額とか店舗で話してもなんかめんどくさいすよね.
とうぜんWEBなら計算できたり画像で確認できたり.


試乗しないのであれば, Amazonで買ってもいいように思ったり.
こゆのあったんだわ!

オプションの選択とかの金額とか店舗で話してもなんかめんどくさいすよね.
とうぜんWEBなら計算できたり画像で確認できたり.


試乗しないのであれば, Amazonで買ってもいいように思ったり.

例えば, RecyclerView で一覧を作成して表示しているとして
1. 田中一郎
2. 佐藤二郎
3. 鈴木三郎
....
サーバなどに問い合わせて取得された以下データ
1. 田中一郎
2. ジローラモ
3. 鈴木三郎
...
を一覧画面に反映させたい場合.
RecyclerView.Adapter に更新を通知する場合,
RecyclerView.Adapter | Android Developers
notify*() のうちアイテムの更新に関するものは
notifyDataSetChanged()
notifyItemChanged(int position, Object payload)
notifyItemChanged(int position)
notifyItemRangeChanged(int positionStart, int itemCount, Object payload)
notifyItemRangeChanged(int positionStart, int itemCount)
ですが, それぞれ以下の面倒な部分がありました.
notifyDataSetChanged()
→ 変更部分のみに関してのアニメーションが表示されない.
notifyItemChanged(int position, Object payload)
notifyItemChanged(int position)
notifyItemRangeChanged(int positionStart, int itemCount, Object payload)
notifyItemRangeChanged(int positionStart, int itemCount)
→ アニメーションは表示されるが, 変更部分の position を計算して渡す必要がある.
その他 hasStableIds() と Loader を使ったりなど面倒でしたよね.
support-library-v7 24.2.0 で登場の DiffUtil を使いましょう.
コールバッククラス作成後, それを使った更新メソッドを Adapter 内に記述します.
MyDiffUtilCallback.java
public class MyDiffUtilCallback extends DiffUtil.Callback{
List<Person> oldPersons;
List<Person> newPersons;
public MyDiffUtilCallback(List<Person> oldPersons, List<Person> newPersons) {
this.oldPersons = oldPersons;
this.newPersons = newPersons;
}
@Override
public int getOldListSize() {
return oldPersons.size();
}
@Override
public int getNewListSize() {
return newPersons.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return oldPersons.get(oldItemPosition).id == newPersons.get(newItemPosition).id;
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return oldPersons.get(oldItemPosition).equals(newPersons.get(newItemPosition));
}
@Nullable
@Override
public Object getChangePayload(int oldItemPosition, int newItemPosition) {
// some additional information
return super.getChangePayload(oldItemPosition, newItemPosition);
}
}
MyRecyclerViewAdapter.java
public void updateList(ArrayList<Person> newList) {
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new MyDiffUtilCallback(this.persons, newList));
diffResult.dispatchUpdatesTo(this);
}
これで, アイテムのポジションの計算はおまかせにして, 同時に綺麗なアニメーションが変更部分に適用されます.
実際, データ量が多い場合は厳しいようなので, RxJava なら メインスレッドにて以下.
@Override
public void onNext(DiffUtil.DiffResult result) {
result.dispatchUpdatesTo(mProductAdapter);
}
kotlinなら同様に以下。
internal class DiffUtilCallback(
private val oldItems: List<Item>,
private val newItems: List<Item>
) : DiffUtil.Callback() {
override fun getOldListSize() = oldItems.size
override fun getNewListSize() = newItems.size
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int)
= oldItems[oldItemPosition].id == newItems[newItemPosition].id
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int)
= oldItems[oldItemPosition] == newItems[newItemPosition]
}
以下のように使うと便利かもしれません.
更新されてます, Gradle が 3.0 に.

Gradle 3.0 released - News - Gradle Forums

The Gradle Daemon is a key performance enhancer, making builds up to 75% faster, but it needed to be explicitly enabled in previous versions of Gradle. This is no longer necessary as the Daemon is now enabled by default in 3.0.
Daemon がデフォルトで起動され, 75% の速度向上らしいので.
プロジェクトルートの位置で.
./gradlew wrapper --gradle-version=3.0
これで, Gradle 側はラッパーインストールできますが, Android Plugin が 2.1.x系では対応できていないようです.
最新のbetaを入れてみましょう.

com.android.tools.build.gradle
(project-root)/build.gradle
buildscript {
//System.properties['com.android.build.gradle.overrideVersionCheck'] = 'true'
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0-beta1'
}
}
Total time: 6.543 secs
↓
Total time: 1.472 secs
小さいプロジェクトでも, 2回目以降のビルドで, 高速になったことが体感できます.
まあ, beta ということで少し待っていたほうがいいのかも知れませんが.
テレビ番組表をみながら, テレビを見ていたのですが,
いきなり楽しみにしていた試合が終わっていたり,
録画の再放送だったり, チャンネル違いだったり,
ライブなのになかなか試合が始まらなかったり,
じゃあ 一体 正式な競技開始の時刻はいつなのか.
それが分かれば, ネット上のSNSや動画サイトなどで競技結果や情報を知ることができたり, 無駄に試合前にテレビの前にいることもありません.
ググるのがよさげです.
「rio 2016」
検索結果の最上段に表示されます.

「日程」のところをクリックして, 実際の競技開始時間を一覧で確認できます.

すべて日本時刻で表示されるので時差の計算も不要です.
あのオライリーから発売されているこの本ですが.

Chapter 1 Gradle for Android Basics
1.1. Gradle Build Files in Android
1.2. Configure SDK Versions and Other Defaults
1.3. Executing Gradle Builds from the Command Line
1.4. Executing Gradle Builds from Android Studio
1.5. Adding Java Library Dependencies
1.6. Adding Library Dependencies Using Android Studio
1.7. Configuring RepositoriesChapter 2 From Project Import to Release
2.1. Setting Project Properties
2.2. Porting Apps from Eclipse ADT to Android Studio
2.3. Porting Apps from Eclipse ADT Using Eclipse
2.4. Upgrading to a Newer Version of Gradle
2.5. Sharing Settings Among Projects
2.6. Signing a Release APK
2.7. Signing a Release APK Using Android StudioChapter 3 Build Types and Flavors
3.1. Working with Build Types
3.2. Product Flavors and Variants
3.3. Merging Resources
3.4. Flavor Dimensions
3.5. Merging Java Sources Across FlavorsChapter 4 Custom Tasks
4.1. Writing Your Own Custom Tasks
4.2. Adding Custom Tasks to the Build Process
4.3. Excluding Tasks
4.4. Custom Source Sets
4.5. Using Android LibrariesChapter 5 Testing
5.1. Unit Testing
5.2. Testing with the Android Testing Support Library
5.3. Functional Testing with Robotium
5.4. Activity Testing with EspressoChapter 6 Performance and Documentation
6.1. Performance Recommendations
6.2. DSL Documentation
Appendix Just Enough Groovy to Get By
Appendix Gradle Basics
無料版PDFが本家Gradleのサイトからダウンロードできるようになっています!

New Gradle Android Ebook for Free - Gradle
メールアドレスなど入力後, 送信されてくるメール内のリンクからダウンロードできます.

図表入りで, 初心者にもわかりやすい内容になっています.


早めにダウンロードしたほうがいいような気がします!