Android控件之RecyclerView的基本使用
2016-06-03 13:33
507 查看
一、为什么叫RecyclerView?
1.不关心Item是否显示在正确的位置、如何显示。2.不关心Item间的分割线。
3.不关注Item增加和删除的动画效果。
4.仅仅关注如何回收和复用View。
二、RecyclerView的基本属性:
1.RecyclerView.Adapter:托管数据集合,为每个Item创建视图;
2.RecyclerView.ViewHolder:承载Item视图的子视图;
3.RecyclerView.LayoutManager:负责Item视图的布局;
4.RecyclerView.ItemDecoration:为每个Item视图添加子视图,在Demo中被用来绘制Divider;
5.RecyclerView.ItemAnimator:负责添加、删除数据时的动画效果;三、RecyclerView使用时要导入android.suport.v7.wedget.RecyclerView包。
RecyclerView实现添加和删除的简单例子<span style="font-size:18px;">public class MainActivity extends AppCompatActivity { private List<String> mDatas; private Context mContext; private RecyclerView mRecyclerView; private RecyclerViewAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); mContext = MainActivity.this; initData(); initView(); //布局管理 LinearLayoutManager llManager = new LinearLayoutManager(mContext); //设置布局管理器 mRecyclerView.setLayoutManager(llManager); //设置分割线 mRecyclerView.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL)); //设置删除、添加的动画 // mRecyclerView.setItemAnimator(new SlideInOutRightItemAnimator(mRecyclerView)); // mRecyclerView.setItemAnimator(new SlideInOutTopItemAnimator(mRecyclerView)); // mRecyclerView.setItemAnimator(new SlideInOutLeftItemAnimator(mRecyclerView)); // mRecyclerView.setItemAnimator(new ScaleInOutItemAnimator(mRecyclerView)); mRecyclerView.setItemAnimator(new SlideInOutBottomItemAnimator(mRecyclerView)); mAdapter = new RecyclerViewAdapter(mContext, mDatas); mRecyclerView.setAdapter(mAdapter); } private void initView() { mRecyclerView = (RecyclerView) findViewById(R.id.recycler); } private void initData() { mDatas = new ArrayList<>(); for (int i = 'A'; i < 'z'; i++){ mDatas.add("" + (char)i); } } @Override public boolean onCreateOptionsMenu(Menu menu) { 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_add) { mAdapter.add("New String",1); return true; } if(id == R.id.action_delete){ mAdapter.remove(1); return true; } return super.onOptionsItemSelected(item); } }</span>
在menu中添加了增加和删除的按钮:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.jeffrey.demo.recyclerviewtest.MainActivity" > <item android:id="@+id/action_add" android:title="ADD" android:orderInCategory="100" android:icon="@drawable/add" app:showAsAction="always" /> <item android:id="@+id/action_delete" android:title="DELETE" android:orderInCategory="100" android:icon="@drawable/delete" app:showAsAction="always" /> </menu>
RecyclerView的适配器:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder>{ public static final int LAST_POSITION = -1 ; private List<String> mDatas; private Context mContext; private LayoutInflater mInflater; public RecyclerViewAdapter(Context context, List<String> datas) { mContext = context; mDatas = datas; mInflater = LayoutInflater.from(mContext); } /** * 创建ViewHolder * @param parent * @param viewType * @return */ @Override public RecyclerViewAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.recycler_item, parent, false); MyViewHolder holder = new MyViewHolder(view); return holder; } /** * 绑定ViewHolder * @param holder * @param position */ @Override public void onBindViewHolder(final RecyclerViewAdapter.MyViewHolder holder, final int position) { holder.tvContent.setText(mDatas.get(position)); holder.tvContent.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //获取item在布局中的位置,防止添加或删除的item的psoition错误的问题 int layoutPosition = holder.getLayoutPosition(); Toast.makeText(mContext, "Position =" + layoutPosition, Toast.LENGTH_SHORT).show(); } }); } @Override public int getItemCount() { return mDatas.size(); } class MyViewHolder extends RecyclerView.ViewHolder{ private TextView tvContent; public MyViewHolder(View itemView) { super(itemView); tvContent = (TextView) itemView.findViewById(R.id.tv_content); } } /** * 增加Item * @param s * @param position */ public void add(String s,int position) { position = position == LAST_POSITION ? getItemCount() : position; mDatas.add(position,s); notifyItemInserted(position); } /** * 删除Item * @param position */ public void remove(int position){ if (position == LAST_POSITION && getItemCount()>0) position = getItemCount() -1 ; if (position > LAST_POSITION && position < getItemCount()) { mDatas.remove(position); notifyItemRemoved(position); } } }
因为本例子中点击Item会显示当前Item的位置,如果对其进行增加和删除操作,点击Item的位置会出现不正确的问题,可以通过ViewHolder中的方法获取当前Item在布局中的位置:
//获取item在布局中的位置,防止添加或删除的item的位置错误的问题 int layoutPosition = holder.getLayoutPosition();
效果展示:
我用动态截图做的,添加和删除的动画效果看不出来。
参考资料:
Android RecyclerView 使用完全解析 体验艺术般的控件
Android 自定义RecyclerView 实现真正的Gallery效果
动画效果以及分割线:An Android library which
provides simple Item animations to RecyclerView items
相关文章推荐
- Android 自定义view设置xml属性
- Android事件传递机制以及ViewGroup的onInterceptTouchEvent的理解
- Android疯狂ListView之旅 第一季 《侧滑删除条目》
- Android 兼容 小问题
- Android 远程调试工具STF——开源项目
- 【Android基础】应用资源
- QQ空间分享
- 【Android】RecyclerView详解(二)
- 【Android基础知识】Service
- Android的px、dp和sp
- android传感器学习之采样率和属性
- android输入框EditText输入银行卡,输入手机,输入身份证格式化的实现
- 【Android】广播机制 Broadcast
- Android Studio开发中常见问题及解决(二)
- Android考试系统
- 关于android资源文件那些事。
- Android开发之Activity详解
- Android中,一些用于统一管理的类,比如 log,比如 toast,比如 url等(toast篇)
- Android 目录过长造成的error Error:too long on Windows, keep below 240 characters :
- Android 插件化之Droid Plugin