您的位置:首页 > 移动开发 > Android开发

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: