Android 5.0 的 ReycylerView 应用

年前做了总结,说好了,两周至少一篇技术文章,好吧,三月份,就先拿5.0的控件凑凑数。(三月跳槽高峰期,我也在找工作,有深圳,有推荐的么?)

我们现在 AS 的项目文件中引入 reycylerview 的支持库:

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

然后我们在 xml 中使用 reyclerview

<android.support.v7.widget.recyclerview  
    android:id="@+id/VerticalLinearRecyclerView" 
    android:layout_height="0dp" 
    android:layout_margintop="10dp" 
    android:layout_weight="1" 
    android:layout_width="match_parent" 
    android:scrollbars="vertical"/>

接下来,我们在 activity 中获取并添加适配器,并添加数据适配器,恩适配器需要使用最新的viewholder。

RecyclerView VerticalLinearRecyclerView= (RecyclerView) rootView.findViewById(R.id.VerticalLinearRecyclerView);  
LinearLayoutManager VerticallinearLayoutManager = new LinearLayoutManager(getActivity()); //这里根据布局管理器设置实际布局方向,不像listview就是固定的竖直方向  
VerticallinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);  
// 创建数据集 
String[] dataset = new String[100];  
for (int i = 0; i < dataset.length; i++){  
    dataset[i] ="item" + i; 
} 
// 创建Adapter,并指定数据集 
RecyclerViewAdapter adapter = new RecyclerViewAdapter(getActivity(),dataset);  
VerticalLinearRecyclerView.setAdapter(adapter);  

接下来,我们看看他的适配器是怎么和 viewholder做到一起的。

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{  
    // 数据集 
    private String[] mDataset; 
    private Context mContext; 
    public RecyclerViewAdapter(Context context,String[] dataset) {
        super();
        mDataset = dataset; 
        mContext = context; 
    } 

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

    @Override public void onBindViewHolder(ViewHolder viewHolder, int i) {
        // 绑定数据到ViewHolder上 
        viewHolder.mTextView.setText(mDataset[i]);
        viewHolder.mTextView.setOnClickListener(new OnClick(i)); 
    } 

    @Override public int getItemCount() { 
        return mDataset.length; 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder{ 
        public TextView mTextView; 
        public ViewHolder(View itemView) {
            super(itemView); 
            mTextView = (TextView) itemView; 
        } 
    } 

    /** * item内部控件点击事件的实现 */ 
    class OnClick implements View.OnClickListener { 
        private int position; 
        public OnClick(int position) { 
          this.position = position; 
        } 
        @Override public void onClick(View v) { 
            Toast.makeText(mContext, "你点击了第" + position + "个text", Toast.LENGTH_SHORT).show(); 
        } 
    } 
}

恩,没错,你看到的,使用viewholder做数据绑定之后,就没有所谓getview的方法,然后还需要你自己是写缓存了。

当然,还能根据不同的布局管理器,实现不同的方法。

这个有demo演示,在我的github里面