본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] v7 에 추가된 RecyclerView 에 대해 알아보자 #2

by 돼지왕 왕돼지 2015. 11. 29.
반응형


 [android] v7 에 추가된 RecyclerView 에 대해 알아보자 #2


출처 : https://developer.android.com/preview/material/ui-widgets.html#recyclerview


adapter, ADD, add animation, animation, custom layoutmanager, default animation, Example, findviewbyid, getitemcount, Gridview, horizontal scroll, item operation, item positioning, LayoutManager, linearlayoutmanager, listview, lookup, onbindviewholder, oncreateviewholder, performance 이슈, Position, recycle, recyclerview, recyclerview.adapter, recyclerview.itemanimator, recyclerview.layoutmanager, remove, remove animation, reuse, scroll, vertical scroll, View, viewholder, Widget, xml, [android] v7 에 추가된 RecyclerView 에 대해 알아보자 #2, 상속





RecyclerView

RecyclerView 는 더 향상되고, 더 유동적인 버전의 ListVIew 라 할 수 있겠다.

이 widget 은 recycle 될 수 있고, scroll 될 수 있는 view 들을 갖는다. 

즉 listview 나 gridview 로 보면 되겠다.




RecyclerView 는 사용하기 편하다. 다음의 것들을 제공하기 때문이다.

- item positioning 을 위한 LayoutManager

- 일반적인 item operation 을 위한 Default animation.


custom layout manager 와 animation 을 정의하여 사용하면 flexibility 를 향상시킬 수 있다.




RecyclerView 를 사용하기 위해서는 adapter 와 layout manager 가 기본으로 필요하다.


adapter 는 RecyclerView.Adapter 를 상속한다.


layout manager 는 RecyclerView 안에서 view item 들의 position 을 결정한다. (view 적인 요소들)

현재 user 에게 보여지지 않는 view 들을 언제 reuse 할 것인지도 결정할 수 있다.

view 를 재사용 ( recycle ) 하기 위해서는 layout manager 가 adapter 에게 교체할 것을 요청할 수 있다.

view 를 이런 방식으로 recycle 하면 값비싼 findViewById lookup 을 비롯한 불필요한 view 생성에 따른 performance 이슈를 피할 수 있다.



RecyclerView 는 LInearLayoutManager 를 제공한다.


LinearLayoutManager 는 vertical 혹은 horizontal scrolling 의 형태로 layouting 하는 것을 제공한다.

다른 형태로 제공하려면 RecyclerView.LayoutManager 를 상속하여 구현하면 된다.





Animation


RecyclerView 를 통해 기본적으로 add, remove animation 은 가능하다.

이 animation 을 customize 하기 위해서는 RecyclerView.ItemAnimator 를 상속해서 사용하면 되며,

RecyclerView.setItemAnimator 함수를 이용하여 set 해주면 된다.





Examples

<android.support.v7.widget.RecyclerView

    android:id="@+id/my_recycler_view"

    android:scrollbars="vertical"

    android:layout_width="match_parent"

    android:layout_height="match_parent"/>


public class MyActivity extends Activity {

    private RecyclerView mRecyclerView;

    private RecyclerView.Adapter mAdapter;

    private RecyclerView.LayoutManager mLayoutManager;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.my_activity);

        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);


        // improve performance if you know that changes in content do not change the size of the RecyclerView

        mRecyclerView.setHasFixedSize(true);


        // use a linear layout manager

        mLayoutManager = new LinearLayoutManager(this);

        mRecyclerView.setLayoutManager(mLayoutManager);


        // specify an adapter (see also next example)

        mAdapter = new MyAdapter(myDataset);

        mRecyclerView.setAdapter(mAdapter);

    }

    ...

}







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

    private String[] mDataset;


    // Provide a reference to the type of views that you are using (custom viewholder)

    public static class ViewHolder extends RecyclerView.ViewHolder {

        public TextView mTextView;

        public ViewHolder(TextView v) {

            super(v);

            mTextView = v;

        }

    }


    // Provide a suitable constructor (depends on the kind of dataset)

    public MyAdapter(String[] myDataset) {

        mDataset = myDataset;

    }


    // Create new views (invoked by the layout manager)

    @Override

    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        // create a new view

        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_text_view, null);

        // set the view's size, margins, paddings and layout parameters

        ...

        ViewHolder vh = new ViewHolder(v);

        return vh;

    }


    // Replace the contents of a view (invoked by the layout manager)

    @Override

    public void onBindViewHolder(ViewHolder holder, int position) {

        // - get element from your dataset at this position

        // - replace the contents of the view with that element

        holder.mTextView.setText(mDataset[position]);


    }


    // Return the size of your dataset (invoked by the layout manager)

    @Override

    public int getItemCount() {

        return mDataset.length;

    }

}








반응형

댓글