RecyclerView学习

简介:
RecyclerView是ListView的一个更高级和灵活的版本。

使用RecycleView必须指定一个adapter(适配器)和一个layout manager(布局管理器)。创建一个adapter继承自RecycleView.Adapter类
layout manager用于RecyclerView里面视图的定位和确定未显示的视图的重新显示。
RecyclerView提供了一下几种内置的layout manager:
     LinearLayoutManage以垂直或水平的滚动列表显示
     GridLayoutManager以网格的形式显示
     StaggeredGridLayoutManager 以交错网格显示
若创建一个自定义的layout manager,需继承自 RecyclerView.LayoutManager类。

使用实例:
1,首先在项目中引入recyclerview的依赖
2,在布局文件中添加RecyclerView

<!-- A RecyclerView with some commonly used attributes -->
<android.support.v7.widget.RecyclerView
   
android:id = "@+id/my_recycler_view"
   
android:scrollbars = "vertical"
   
android:layout_width = "match_parent"
    android:layout_height = "match_parent" />
3,与layout manager关联起来
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);

        // 如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
        mRecyclerView.setHasFixedSize(true);

       
// 使用线性布局
        mLayoutManager 
= new LinearLayoutManager(this);
        mRecyclerView
.setLayoutManager(mLayoutManager);

        // 指定一个adapter (见下一步)
        mAdapter = new MyAdapter(myDataset);
        mRecyclerView
.setAdapter(mAdapter);
   
}
   
...
}
4,建立adapter
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
   
private String[] mDataset;

    // 在ViewHolder中提供提供每个列表项所需要的所有views,如使用findViewById方法
    public static class ViewHolder extends RecyclerView.ViewHolder {
       
        public TextView mTextView;
          //ViewHolder的构造函数
        public ViewHolder(TextView v) {
            super(v);
            mTextView = (TextView)v.findViewById(R.id.text);
        }
   
}

    // MyAdapter的构造函数 (依赖数据的类型,可为list<>、数组等)
    public MyAdapter(String[] myDataset) {
        mDataset = myDataset;  //此例为String[]数组类型
    }

   
// 创建一个新的ViewHolder
   
@Override
   
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   
int viewType) {
        // 加载布局并转化为View, my_text_view布局自己创建
        View v = LayoutInflater.from(parent.getContext())
                               .inflate(R.layout.my_text_view, parent, false);  //false不要忘
        // 可以设置view的布局参数
        ...
        //将V传递给RecycleView封装好的ViewHolder
        ViewHolder vh = new ViewHolder(v);
       
return vh;
   
}

    // 更新ViewHolder里面的数据
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        // 用你数据源的元素代替此position上的内容
        holder.mTextView.setText(mDataset[position]);

   
}

   
// 返回数据源的大小
   
@Override
   
public int getItemCount() {
       
return mDataset.length;
   
}
}

5,添加点击事件(全部在自定义的MyAdapter中实现,观察者模式)

     ①在MyAdapter中定义如下接口
public static interface onRecyclerViewItemClickListener {
void onItemClick(View view,String data);
}
     ②声明这个借口的变量
private onRecyclerViewItemClickListener mItemClickListener = null;
     ③为暴露给外面的调用者,定义一个设置Listener的方法(),如下:
public void setOnItemClickListener(onRecyclerViewItemClickListener listener) {
this.mItemClickListener = listener;
}
     ④为MyAdapter实现OnClickListener方法( 注意:别忘了实现View.OnClickListener 接口
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements View.OnClickListener{
 @Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item,parent,false);
ViewHolder vh = new ViewHolder(v);
v.setOnClickListener(this); //将v注册点击事件
return vh;
     }
 @Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mTextView.setText(myData.get(position).getTitle());
holder.mImageView.setImageResource(R.mipmap.ic_launcher);
holder.itemView.setTag(myData.get(position));//将数据保存在itemView的Tag中,以便点击时进行获取
     }

@Override
public void onClick(View v) {
if (mItemClickListener != null) {
mItemClickListener.onItemClick(v, (String) v.getTag());//注意这里使用getTag方法获取数据
          }
     }
}

     此时我们就可以在Activity或其他地方为RecyclerView添加项目点击事件了,如下:
   private MyAdapter adapter;
 (注意:若写成private RecyclerView.Adapter adapter;则不会实现adapter .setOnItemClickListener()方法
adapter = new MyAdapter(titleList);
mRecyclerView.setAdapter(adapter);
adapter.setOnItemClickListener(new MyAdapter.onRecyclerViewItemClickListener() {
@Override
public void onItemClick(View view, String data) {
     //实现自己的点击事件
}
});


6,添加删除数据
以前在ListView当中,我们只要修改后数据用Adapter的notifyDatasetChange一下就可以更新界面。然而在RecyclerView中还有一些更高级的用法:

添加数据:
public void addItem(DataModel content, int position) {
   datas.add(position, content);
   notifyItemInserted(position); //Attention!
}

删除数据:
public void removeItem(DataModel model) {
   int position = datas.indexOf(model);
   datas.remove(position);
   notifyItemRemoved(position);//Attention!
}

值得注意的是RecyclerView的添加删除都是有默认的动画效果的,如果没有效果可以添加如下代码:
mRecyclerView.setItemAnimator(newDefaultItemAnimator());





你可能感兴趣的:(android,Studio,RecyclerView)