LoginSignup
41
40

More than 5 years have passed since last update.

5系の新しいapiの実装方法を調べた(+RxJava)

Last updated at Posted at 2014-11-30

今回調査したのは、

  • 左上のクルクルする矢印アイコンの実装方法
  • リップルエフェクト(波紋のように広がるエフェクト)の実装方法
  • RecyclerViewの実装方法
  • サポートライブラリがどこまで対応してるか

加えて、最近流行っているRxJavaも気になっていたので、[ネットワーク通信] -> [リストアダプターに流し組む]部分をRxJava(+Retrofit)で実装しました

クルクルする矢印アイコンの実装方法

クルクルする矢印のアイコンはサポートライブラリで提供されていて、
利用するにはappcompat-v7をいれます

compile 'com.android.support:appcompat-v7:21.+'

あとはこんな感じのテンプレコードを書けば動きます

drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.start, R.string.stop);
drawerToggle.setDrawerIndicatorEnabled(true);
drawerLayout.setDrawerListener(drawerToggle);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return drawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        drawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        drawerToggle.onConfigurationChanged(newConfig);
    }

ActionBarDrawerToggleってv4のサポートライブラリの方にもあって、それに気づかないと結構ハマります

リップルエフェクト(波紋のように広がるエフェクト)の実装方法

リップルエフェクトもデフォルトのものは、SDKが提供してくれていて、
エフェクトを掛けたいviewのbackgroundを指定します

android:background="?android:attr/selectableItemBackground"

実はもう一種類あって

android:background="?android:attr/selectableItemBackgroundBorderless"

こっちはviewを跨いだ波紋が広がるエフェクトになるっぽい? のですが、minSDKが21なのでLollipopにしか使えません

RecyclerViewの実装方法

Adapterを作るのはListViewを同じ、RecyclerView.Adapterの実装は簡略化すると概ねこんな感じ、

public class EntryAdapter extends RecyclerView.Adapter<EntryAdapter.ViewHolder> {
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // viewをinflateしてViewHolderを作成する
        View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.cell_xxx, parent, false);
        return new ViewHolder(view);
    }
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
    // getView相当の処理(view.setText() etc...)
    }
    @Override
    public int getItemViewType(int position) {
        return // viewTypeを返す;
    }
}

昔のAdapterの実装とほとんど変わんないのですが、新しい概念としてViewTypeというのが追加されてて
複数のviewをレンダリングするタイプのリストを作成したい場合はgetItemViewTypeをOverrideしてよしなに出来ます
Activity側はこんな感じ

RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
entryAdapter = new EntryAdapter();
recyclerView.setAdapter(entryAdapter);

サポートライブラリがどこまで対応してるのか

これは正直ちゃんと調べてないのでわからないですが、少なくとも上の3つはサポートライブラリで対応できました
(気になるの他に何かあったかな..)

RxJava

[ネットワーク通信] -> [リストアダプターに流し組む]は下のコードような感じ
そこそこ複雑なリストの処理してるけど、完結でわかりやすく書ける
学習コスト低いのでコスパ的に考えるとかなりいい気がする
特にRetrofitがRxjava対応していてホント便利だった。
使い方は、wikiサンプル見れば簡単な処理ならすぐ出来そう

        category.observable(app)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(() -> {
                // something..
                })
                .onErrorReturn(throwable -> {
                // something..
                })
                .map(entries -> {
                // something..
                })
                .flatMap(Observable::from)
                .groupBy(entry -> {
                // something..
                })
                .subscribe(observable -> {
                    if (observable.getKey() == EntryType.onlyTitle) {
                        observable.subscribe(entryAdapter::add);
                    } else if (observable.getKey() == EntryType.WithImage) {
                        observable
                                .buffer(2)
                                .filter(// something )
                                .subscribe(entryAdapter::add);
                    }
                });

今回作ったアプリ


良かったらサンプルアプリとしてご活用下さい

41
40
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
40