初识RecyclerView

有了RecyclerView可以更灵活的实现我们的各种列表。

配置:

compile 'com.android.support:recyclerview-v7:+'

layout:

<android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

java:

public class MainActivity extends Activity{

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

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        // 设置水平滑动
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

        recyclerView.setLayoutManager(layoutManager);

        String[] dataset = new String[100];
        for (int i=0 ; i < dataset.length ; i++) {
            dataset[i] = "Item " + i;
        }
        MyAdapter adapter = new MyAdapter(dataset);
        recyclerView.setAdapter(adapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private 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 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;
        }

        @Override
        public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            Log.i("zoro" , "onCreateViewHolder : " + i);
            // 创建一个View,简单起见直接使用系统提供的布局,就是一个TextView
            TextView view = (TextView)View.inflate(viewGroup.getContext(), android.R.layout.simple_list_item_1, null);
            // 创建一个ViewHolder
            ViewHolder viewHolder = new ViewHolder(view);
            return viewHolder;
        }

        @Override
        public void onBindViewHolder(ViewHolder viewHolder, int i) {
            Log.i("zoro" , "onBindViewHolder : " + i);
            viewHolder.mTextView.setText(mDataset[i]);
        }

        @Override
        public int getItemCount() {
            Log.i("zoro" , "getItemCount");
            return mDataset.length;
        }
    }
}

有几个主要的需要认识的类:

RecyclerView : 本文主角

LinearLayoutManager : 可以对RecyclerView进行设置,比如横向还是纵向

RecyclerView.Adapter : 类似Listview的adapter,只不过不同的是,这里是针对viewholder进行复用的。


以下是log

09-10 14:57:18.143  11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.143  11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.241  11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.241  11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.242  11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.242  11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.242  11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.242  11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 14:57:18.244  11693-11693/? I/zoro﹕ onBindViewHolder : 0
09-10 14:57:18.246  11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.246  11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 14:57:18.246  11693-11693/? I/zoro﹕ onBindViewHolder : 1
09-10 14:57:18.247  11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.247  11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 14:57:18.247  11693-11693/? I/zoro﹕ onBindViewHolder : 2
09-10 14:57:18.248  11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.248  11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 14:57:18.248  11693-11693/? I/zoro﹕ onBindViewHolder : 3
09-10 14:57:18.248  11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.248  11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 14:57:18.249  11693-11693/? I/zoro﹕ onBindViewHolder : 4
09-10 14:57:18.249  11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.249  11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 14:57:18.257  11693-11693/? I/zoro﹕ onBindViewHolder : 5
09-10 14:57:18.260  11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.260  11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 14:57:18.260  11693-11693/? I/zoro﹕ onBindViewHolder : 6
09-10 14:57:18.261  11693-11693/? I/zoro﹕ getItemCount
09-10 14:57:18.261  11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 14:57:18.261  11693-11693/? I/zoro﹕ onBindViewHolder : 7

可以看出每次都会调用getItemCount,每次创建ViewHolder都是从onCreateViewHolder(ViewGroup viewGroup, int i)开始创建的,后面的都直接绑定

onCreateViewHolder(ViewGroup viewGroup, int i)中的第二个参数,是type的意思


09-10 15:03:56.779  11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 15:03:56.783  11693-11693/? I/zoro﹕ onBindViewHolder : 8
09-10 15:03:56.862  11693-11693/? I/zoro﹕ getItemCount
09-10 15:03:56.862  11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 15:03:56.864  11693-11693/? I/zoro﹕ onBindViewHolder : 9
09-10 15:03:56.946  11693-11693/? I/zoro﹕ getItemCount
09-10 15:03:56.946  11693-11693/? I/zoro﹕ onCreateViewHolder : 0
09-10 15:03:56.949  11693-11693/? I/zoro﹕ onBindViewHolder : 10
09-10 15:03:57.027  11693-11693/? I/zoro﹕ getItemCount
09-10 15:03:57.027  11693-11693/? I/zoro﹕ onBindViewHolder : 11
09-10 15:03:57.125  11693-11693/? I/zoro﹕ getItemCount
09-10 15:03:57.125  11693-11693/? I/zoro﹕ onBindViewHolder : 12
09-10 15:03:57.315  11693-11693/? I/zoro﹕ getItemCount
09-10 15:03:57.315  11693-11693/? I/zoro﹕ onBindViewHolder : 13

等创建够所需的ViewHolder之后,就开始复用了。





参考:http://blog.csdn.net/ipip2005/article/details/38581427

http://chuansong.me/n/510236

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值