文/程序员男神
前言
最近一直都在忙公司的新项目,忙的连自己学习的时间都没了(此处有掌声),又厚着脸皮装逼了一次,回到家都累成狗,还要总结最近学习的技术。这个总结会分为三篇去写,让你从懵懂无知变成情场高手,错错错...,变成职场达人。
今天本来约小女友出去吃饭,因为是自己生日,谁知今天她临时有事,就在家撸代码给自己过个生日吧!
概述
RecycleView为什么会取代ListView?
RecylerView是support-v7包中的新组件,是一个强大的滑动组件。
优势如下:
1、RecylerView封装了ViewHolder的回收复用,也就是说RecylerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的逻辑被封装了,写起来更加简单。
2、提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecylerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。
3、可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecylerView有其自己默认的实现。
RecycleView的基本用法
1、你想要控制其显示的方式,请通过布局管理器LayoutManager
2、你想要控制Item间的间隔(可绘制),请通过ItemDecoration
3、你想要控制Item增删的动画,请通过ItemAnimator
4、你想要控制点击、长按事件,对不起,自己Mark接口回调
5、你想要控制Item的增删,对不起,也是自己Mark
相应代码:
mRecyclerView = (RecyclerView) findViewById(R.id.recycle_view);
//设置分割线
mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
mLayoutManager = new LinearLayoutManager(this);
//设置布局管理器
mRecyclerView.setLayoutManager(mLayoutManager);
//绑定数据
mAdapter = new RecycleAdapter(list);
//设置Item增加、移除动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//设置Adapter
mRecyclerView.setAdapter(mAdapter);
//点击、长按回调接口代码
/**
* 定义接口回调
*/
public interface OnItemClickListener {
void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}
private OnItemClickListener mOnItemClickListener;
public void setOnItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
/**
* 向指定位置添加元素
*/
public void addItem(int position, String value) {
if (position > data.size()) {
position = data.size();
}
if (position < 0) {
position = 0;
}
/**
* 使用notifyItemInserted/notifyItemRemoved会有动画效果
* 而使用notifyDataSetChanged()则没有
*/
data.add(position, value);//在集合中添加这条数据
notifyItemInserted(position);//通知插入了数据
}
/**
* 移除指定位置元素
*/
public String removeItem(int position) {
if (position > data.size() - 1) {
return null;
}
String value = data.remove(position);//所以还需要手动在集合中删除一次
notifyItemRemoved(position);//通知删除了数据,但是没有删除list集合中的数据
return value;
}
要想使用,我们需要在gradle中添加依赖:
compile 'com.android.support:recyclerview-v7:25.3.1'
具体事例代码:
MainActivity的代码:
/**
* desc: Recycle的简单使用
* author: dj
* date: 2017/3/2 9:57
*/
public class RecycleActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private RecycleAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private List<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycle);
initDate();
initView();
}
private void initDate() {
list = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
list.add("西红柿炒鸡蛋");
}
}
private void initView() {
mRecyclerView = (RecyclerView) findViewById(R.id.recycle_view);
mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new RecycleAdapter(list);
mRecyclerView.setAdapter(mAdapter);
mAdapter.setOnItemClickListener(new RecycleAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText(RecycleActivity.this,"onItemClick",Toast.LENGTH_SHORT).show();
}
@Override
public void onItemLongClick(View view, int position) {
Toast.makeText(RecycleActivity.this,"onItemLongClick",Toast.LENGTH_SHORT).show();
}
});
}
}
接下来我们看看我们的Adapter怎么去写?
代码如下:
/**
* desc: RecycleView的Adapter
* author: dj
* date: 2017/2/28 15:20
*/
public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.ViewHolder> {
private List<String> date;
//构造器,接受数据集
public RecycleAdapter(List<String> date) {
this.date = date;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
//将数据填充到具体的view中
holder.icon.setImageResource(R.drawable.jian);
holder.title.setText(date.get(position));
holder.desc.setText(date.get(position));
// 如果设置了回调,则设置点击事件
if (mOnItemClickListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position1 = holder.getLayoutPosition();
mOnItemClickListener.onItemClick(holder.itemView, position1);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int position1 = holder.getLayoutPosition();
mOnItemClickListener.onItemLongClick(holder.itemView, position1);
return false;
}
});
}
}
@Override
public int getItemCount() {
return date.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
public ImageView icon;
public TextView title;
public TextView desc;
public ViewHolder(View itemView) {
super(itemView);
//由于itemView是item的布局文件,我们需要的是里面的textView,因此利用itemView.findViewById获
//取里面的textView实例,后面通过onBindViewHolder方法能直接填充数据到每一个textView了
icon = (ImageView) itemView.findViewById(R.id.item_image);
title = (TextView) itemView.findViewById(R.id.item_title);
desc = (TextView) itemView.findViewById(R.id.item_desc);
}
}
/**
* 定义接口回调
*/
public interface OnItemClickListener {
void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}
private OnItemClickListener mOnItemClickListener;
public void setOnItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
}
接下来就是我们简单一下xml文件:
activity_recycle的代码:
<?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:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycle_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
item_list的代码:
<?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="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/item_image"
android:layout_width="100dp"
android:layout_height="70dp"
android:padding="6dp" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/item_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@android:style/TextAppearance.Large" />
<TextView
android:id="@+id/item_desc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2" />
</LinearLayout>
</LinearLayout>
效果图如下:
总结
上面这些就是RecycleView的基本使用,显示一个图片,两行文字的效果。
参考:http://blog.csdn.net/lmj623565791/article/details/45059587