読者です 読者をやめる 読者になる 読者になる

うさがにっき

読書感想文とプログラムのこと書いてきます

RecyclerViewの中にNestedScrollViewを入れてみる(失敗)

概要

NestedScrollViewがでたことにより内部にScrollViewを入れれるようになった
なのでRecyclerViewにNestedScrollView入れてみたらどうなるか調べてみた

詳細

listviewでもよかったんだが、ViewHolderをかえてスクロールするところとスクロールしないところを作りたかったのでrecyclerViewを使った
ソースは以下の感じ
fragment

        RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(getActivity().getApplicationContext());
        recyclerView.setAdapter(recyclerViewAdapter);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
        recyclerView.setLayoutManager(layoutManager);
        return view;

RecyclerViewAdapter

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

    private final static int IMAGE_VIEW_TYPE = 0;
    private final static int SCROLL_VIEW = 1;

    Context _context;

    static class ImageViewHolder extends RecyclerView.ViewHolder{
        ImageView imageView;

        public ImageViewHolder(View itemView) {
            super(itemView);

            imageView = (ImageView)itemView.findViewById(R.id.image);
        }
    }

    static class ScrollViewHolder  extends RecyclerView.ViewHolder{
        NestedScrollView nestedScrollView;

        public ScrollViewHolder(View itemView) {
            super(itemView);

            nestedScrollView = (NestedScrollView)itemView.findViewById(R.id.scrollview);
        }
    }

    public RecyclerViewAdapter(Context context) {
        _context = context;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(_context);
        if (viewType == IMAGE_VIEW_TYPE) {
            return new ImageViewHolder(
                    layoutInflater.inflate(R.layout.adapter_image_item, parent, false));
        } else {
            return new ScrollViewHolder(
                    layoutInflater.inflate(R.layout.adapter_scroll_item, parent, false));
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if(position % 2 == IMAGE_VIEW_TYPE) {
            ImageViewHolder imageViewHolder = (ImageViewHolder)holder;
        }else {
            ScrollViewHolder scrollViewHolder = (ScrollViewHolder)holder;
        }
    }

    @Override
    public int getItemCount() {
        return 10;
    }

    @Override
    public int getItemViewType(int position) {

        return position % 2;
    }
}

ImageViewとNestedScrollVIewを交互に表示するようにした

結論は上手く動かなった

理想はNestedScrollVIewの位置はNestedScrollViewのスクロールが動いてほしかったのだが、RecyclerViewのスクロールが優先され、NestedScrollViewのスクロールは動かなった、ここらへんはRecyclerViewからNestedScrollViewにスクロールイベントを渡すなどの処理が必要になる様子だった