うちなー えんじにあ ぶろぐ

開発に関するブログです 沖縄県民 Android好き

Android RecycleViewとDataBindingでViewHolder不要?なシンプル開発

触ってみましたRecycleView!
組み合わせてみましたDataBinding!
結論として、ViewHolderが殆ど不要となり、シンプルにできたなーと思ったのでちょっと書いてみます。
注意!
DataBindingの話はあまりしません。
DataBinding使って簡単にRecycleViewが作れるという感じです。

環境

AndroidStudio 3
Java
DataBinding

完成画面

とりあえず、イメージをどん!!
f:id:kamiya-kizuku:20180219154205p:plain

超簡単に作りましたw

RecycleViewのAdapter

とりあえずAdapter全部!!!

/**
 * RecycleView Adapter
 * Created by k-kamiya on 2018/02/19.
 */
public class Adapter extends RecyclerView.Adapter {

    private List<Model> mModels;

    /**
     * コンストラクタ
     */
    public Adapter() {
        mModels = new ArrayList<>();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        // DataBindingクラスの作成
        ActivityRowBinding binding = DataBindingUtil.inflate(
                LayoutInflater.from(parent.getContext()),
                R.layout.activity_row,
                parent,
                false);

        // RootViewを取得
        View rootView = binding.getRoot();

        // RootViewのTagにDataBindingを設定
        rootView.setTag(binding);

        // RecycleViewのインスタンス生成、Abstractだたから{}が必要。。。
        // 気になるようだったら、別クラスへ!
        return new RecyclerView.ViewHolder(rootView) {};
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        // ViewHolderのitemViewからonCreateViewHolderで設定したDataBindingClassを取得
        ActivityRowBinding binding = (ActivityRowBinding) holder.itemView.getTag();
        // ModelとViewのBind
        binding.setModel(getItem(position));
    }

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

    public void setModels(List<Model> models) {
        mModels = models;
    }

    public List<Model> getModels() {
        return mModels;
    }

    public Model getItem(int position){
        return mModels.get(position);
    }
}

重要ポイント onCreateViewHolder

地味に少ポイントw
引数のparent(ConvertView)からContextを取得すると、
AdapterクラスにContext渡す必要が無い!

DataBindingからRootViewを取得、
その後RootViewのTagにDataBindingを設定!
後は、その場でRecyclerView.ViewHolderをインスタンス生成するだけ!

ただ、ViewHolderがAbstractなので、生成時の{}が気になる。。。
static classとか別に持つことできれいに書けるがちょっとね。。。w

Adapterの生成箇所

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        Adapter adapter = new Adapter();
        binding.recycleView.setLayoutManager(new LinearLayoutManager(this));
        binding.recycleView.setAdapter(adapter);

        // 追加ボタン押下
        binding.add.setOnClickListener((v -> {
            // Model作成、わかりやすいようにPosition設定
            Model model = new Model();
            model.setTitle(
                    String.format(
                            Locale.getDefault(),
                            "タイトル = %d",
                            adapter.getItemCount() + 1)
            );

            model.setDescription(
                    String.format(
                            Locale.getDefault(),
                            "詳細 = %d",
                            adapter.getItemCount() + 1)
            );
            // Adapterに追加
            adapter.getModels().add(model);
            adapter.notifyDataSetChanged();
        }));
    }
}

殆ど書いてないですねw
ボタン押した後の処理が一番多いw

では今回は簡単に、こんな感じで!
DataBindingを利用して、シンプルにRecycleViewのAdapterクラスを実装してみました。

Github

github.com
あげてますー