RecyclerView使用介绍
来源:互联网 发布:宋岳庭的故事 知乎 编辑:程序博客网 时间:2024/06/15 16:23
RecyclerView是一个比ListView更灵活的一个控件 ,可以说是ListView和GridView的升级版,RecyclerView的使用方法和ListView 类似
添加库依赖: compile 'com.android.support:recyclerview-v7:25.3.1+'
在布局文件中加入 RecyclerView控件,为 RecyclerView控件指定一个ID,设置宽和高都为 match_parent 占满整个屏幕
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view_test_rv" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent"/></LinearLayout>
接下来修改MainActivity的代码 ,在Activity中获取RecyclerView控件然后进行设置LayoutManger以及Adapter
MainActivity.Java
public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView;//获取控件 private PersonAdapter adapter;//添加适配器 private List<Person> personList = new ArrayList<>();//存放数据集合 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //通过id获取到recyclerView recyclerView= (RecyclerView) findViewById(R.id.recycler_view_test_rv); //设置RecyclerView保持固定的大小,提高RecyclerView的性能 recyclerView.setHasFixedSize(true); // 1 设置布局方式LinearLayout RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); // 2 设置瀑布流式的布局StaggeredGridLayout //在适配器的onBindViewHolder方法中为我们的item设置个随机的高度 就可以实现瀑布流布局 //StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL); // 3 设置布局方式 GridLayout // GridLayoutManager layoutManager=new GridLayoutManager(this,4); //设置水平滚动布局,, 不设置默认是 垂直滚动布局 // layoutManager.setOrientation(OrientationHelper.HORIZONTAL); //将布局管理器加载到 recyclerView中 recyclerView.setLayoutManager(layoutManager); //设置动画效果 recyclerView.setItemAnimator(new DefaultItemAnimator()); initData();//初始化数据 //新建适配器 adapter = new PersonAdapter(personList); //RecyclerView 设置item 点击和长按 监听事件 adapter.setOnRecyclerViewListener(new PersonAdapter.OnRecyclerViewListener() { @Override public void onItemClick(int position) { Toast.makeText(MainActivity.this, "点击了"+position, Toast.LENGTH_SHORT).show(); } @Override public boolean onItemLongClick(int position) { if(recyclerView!=null) { //长按删除 //adapter.notifyItemRemoved(position); //personList.remove(position); // adapter.notifyItemRangeChanged(position, adapter.getItemCount()); Toast.makeText(MainActivity.this, "长按了" + position, Toast.LENGTH_SHORT).show(); } return false; } }); //recyclerview设置适配器 recyclerView.setAdapter(adapter); //---------------------------------Item拖拽和滑动删除----------------------------- ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() { //用于设置拖拽和滑动的方向 @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { int dragFlags = 0, swipeFlags = 0; if (recyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager || recyclerView.getLayoutManager() instanceof GridLayoutManager) { //网格式布局有4个方向 dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; } else if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) { //线性式布局有2个方向 dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; //设置侧滑方向为从两个方向都可以 } return makeMovementFlags(dragFlags, swipeFlags);//swipeFlags 为0的话item不滑动 } //长摁item拖拽时会回调这个方法 @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { int from = viewHolder.getAdapterPosition(); int to = target.getAdapterPosition(); //处理拖拽操作 ***前提是isLongPressDragEnabled()方法 返回true*** Person moveItem = personList.get(from); personList.remove(from); personList.add(to, moveItem);//交换数据链表中数据的位置 adapter.notifyItemMoved(from, to);//移动刷新 return true; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { //这里处理滑动删除 int index = viewHolder.getAdapterPosition();//获取到拖动到位置 personList.remove(index);//删除 adapter.notifyItemRemoved(index);//删除刷新 /* //新Adapter还提供了其他的方法 //调用adapter.notifyDataSetChanged()方法,会重新调用onBindViewHolder()方法 public final void notifyDataSetChanged() //调用adapter.notifyItemChanged(int position),position数据发生了改变,会回调对应position的onBindViewHolder()方法来刷新数据 public final void notifyItemChanged(int position) //调用adapter.notifyItemRangeChanged(int positionStart, int itemCount) 刷新从positionStart开始itemCount数量的item了(这里的刷新指回调onBindViewHolder()方法) public final void notifyItemRangeChanged(int positionStart, int itemCount) //调用adapter.notifyItemInserted(int position) 在第position位置被插入了一条数据的时候 用这个方法刷新数据 public final void notifyItemInserted(int position) //调用adapter.notifyItemMoved(int fromPosition, int toPosition) 从fromPosition移动到toPosition的时候可以使用这个方法刷新数据 public final void notifyItemMoved(int fromPosition, int toPosition) //调用adapter.notifyItemRangeInserted(int positionStart, int itemCount) 批量添加。刷新数据 public final void notifyItemRangeInserted(int positionStart, int itemCount) //调用adapter. notifyItemRemoved(int position) 第position个被删除的时候刷新,同样会有动画。 public final void notifyItemRemoved(int position) //调用adapter.notifyItemRangeRemoved(int positionStart, int itemCount) 批量删除 刷新数据 public final void notifyItemRangeRemoved(int positionStart, int itemCount) */ } @Override public boolean isLongPressDragEnabled() { return true;//返回true则为所有item都设置可以拖拽 } }); //itemTouchHelper需要与recyclerView绑定才有效果,在recyclerView初始化的时候调用 itemTouchHelper.attachToRecyclerView(recyclerView); //---------------------------------------------------------------------------- } //初始化数据 private void initData() { for (int i=1; i < 100; i++) { Person person = new Person("zhaosi" + i, i); personList.add(person); } }}
Person 类只有个name 和age两个字段,这里就不写代码了。
自定义一个适配器PersonAdapter 来进行创建item view以及绑定数据
class PersonAdapter extends RecyclerView.Adapter { public interface OnRecyclerViewListener { void onItemClick(int position); boolean onItemLongClick(int position); } private static final String TAG = PersonAdapter.class.getSimpleName(); private OnRecyclerViewListener onRecyclerViewListener; private List<Person> list; //构造函数 public PersonAdapter(List<Person> list) { this.list = list; } public void setOnRecyclerViewListener(OnRecyclerViewListener onRecyclerViewListener) { this.onRecyclerViewListener = onRecyclerViewListener; } /** * 这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。 * 方法是把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例 * */ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Log.d(TAG, "onCreateViewHolder, i: " + viewType); View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.person_item, null); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); view.setLayoutParams(lp); return new PersonViewHolder(view); } /** * 这个方法主要用于适配渲染数据到View中。方法提供给你了一个viewHolder,而不是原来的convertView。 */ @Override public void onBindViewHolder(RecyclerView.ViewHolder vholder, int position) { Log.d(TAG, "onBindViewHolder, i: " + position + ", viewHolder: " + vholder); PersonViewHolder holder = (PersonViewHolder) vholder; holder.position = position; Person person = list.get(position); holder.nameTv.setText(person.getName()); holder.ageTv.setText(person.getAge() + "岁"); } @Override public int getItemCount() { return list.size(); } class PersonViewHolder extends RecyclerView.ViewHolder { public View rootView; public TextView nameTv; public TextView ageTv; public int position; public PersonViewHolder(View view) { super(view); //通过id 加载控件 nameTv = (TextView) itemView.findViewById(R.id.recycler_view_test_item_person_name_tv); ageTv = (TextView) itemView.findViewById(R.id.recycler_view_test_item_person_age_tv); rootView = itemView.findViewById(R.id.recycler_view_test_item_person_view); //item点击事件监听 rootView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (null != onRecyclerViewListener) { onRecyclerViewListener.onItemClick(position); } } }); //item长按事件监听 rootView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if(null != onRecyclerViewListener){ return onRecyclerViewListener.onItemLongClick(position); } return false; } }); } }}
每个item的布局person_item.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/recycler_view_test_item_person_view" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="15dp" android:background="#aa00cc" > <TextView android:id="@+id/recycler_view_test_item_person_name_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:background="#cc55aa" /> <TextView android:id="@+id/recycler_view_test_item_person_age_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="5dp" android:background="#cc33bb" android:textSize="15sp" /></LinearLayout>
0 0
- RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView使用介绍
- Android RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView简单使用介绍
- RecyclerView详细介绍&使用。
- Android RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView简单使用介绍
- RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView使用介绍
- RecyclerView使用介绍
- mybatis把整数0识别为null
- Ocr引擎
- 你喜欢的搞笑内容都在这里-----笑口常开
- mysql优化 索引
- ZOJ
- RecyclerView使用介绍
- Android6.0之Intent使用与源码分析
- window下通过nvm-windows来安装多版本node
- Configuration the Remote desktop Connection in Windows 2012R2
- web--3.页面跳转
- 我对Unity中Quaternion * Vector3的理解
- Architectures与Valid Architectures区别
- 【Linux】僵尸进程与孤儿进程
- android studio导入module后报错的问题