文/程序員男神
前言
最近一直都在忙公司的新項目硬梁,忙的連自己學(xué)習(xí)的時間都沒了(此處有掌聲),又厚著臉皮裝逼了一次胞得,回到家都累成狗荧止,還要總結(jié)最近學(xué)習(xí)的技術(shù)。這個總結(jié)會分為三篇去寫阶剑,讓你從懵懂無知變成情場高手罩息,錯錯錯...,變成職場達(dá)人个扰。
今天本來約小女友出去吃飯,因為是自己生日葱色,誰知今天她臨時有事递宅,就在家擼代碼給自己過個生日吧!
概述
RecycleView為什么會取代ListView苍狰?
RecylerView是support-v7包中的新組件办龄,是一個強(qiáng)大的滑動組件。
優(yōu)勢如下:
1淋昭、RecylerView封裝了ViewHolder的回收復(fù)用俐填,也就是說RecylerView標(biāo)準(zhǔn)化了ViewHolder,編寫Adapter面向的是ViewHolder而不再是View了翔忽,復(fù)用的邏輯被封裝了英融,寫起來更加簡單。
2歇式、提供了一種插拔式的體驗驶悟,高度的解耦,異常的靈活材失,針對一個Item的顯示RecylerView專門抽取出了相應(yīng)的類痕鳍,來控制Item的顯示,使其的擴(kuò)展性非常強(qiáng)。
3笼呆、可以控制Item增刪的動畫熊响,可以通過ItemAnimator這個類進(jìn)行控制,當(dāng)然針對增刪的動畫诗赌,RecylerView有其自己默認(rèn)的實現(xiàn)汗茄。
RecycleView的基本用法
1、你想要控制其顯示的方式境肾,請通過布局管理器LayoutManager
2剔难、你想要控制Item間的間隔(可繪制),請通過ItemDecoration
3奥喻、你想要控制Item增刪的動畫偶宫,請通過ItemAnimator
4、你想要控制點擊环鲤、長按事件纯趋,對不起,自己Mark接口回調(diào)
5冷离、你想要控制Item的增刪吵冒,對不起,也是自己Mark
相應(yīng)代碼:
mRecyclerView = (RecyclerView) findViewById(R.id.recycle_view);
//設(shè)置分割線
mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
mLayoutManager = new LinearLayoutManager(this);
//設(shè)置布局管理器
mRecyclerView.setLayoutManager(mLayoutManager);
//綁定數(shù)據(jù)
mAdapter = new RecycleAdapter(list);
//設(shè)置Item增加西剥、移除動畫
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//設(shè)置Adapter
mRecyclerView.setAdapter(mAdapter);
//點擊痹栖、長按回調(diào)接口代碼
/**
* 定義接口回調(diào)
*/
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);//在集合中添加這條數(shù)據(jù)
notifyItemInserted(position);//通知插入了數(shù)據(jù)
}
/**
* 移除指定位置元素
*/
public String removeItem(int position) {
if (position > data.size() - 1) {
return null;
}
String value = data.remove(position);//所以還需要手動在集合中刪除一次
notifyItemRemoved(position);//通知刪除了數(shù)據(jù),但是沒有刪除list集合中的數(shù)據(jù)
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;
//構(gòu)造器瞭空,接受數(shù)據(jù)集
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) {
//將數(shù)據(jù)填充到具體的view中
holder.icon.setImageResource(R.drawable.jian);
holder.title.setText(date.get(position));
holder.desc.setText(date.get(position));
// 如果設(shè)置了回調(diào)揪阿,則設(shè)置點擊事件
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方法能直接填充數(shù)據(jù)到每一個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);
}
}
/**
* 定義接口回調(diào)
*/
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>
效果圖如下:
總結(jié)
上面這些就是RecycleView的基本使用,顯示一個圖片旧找,兩行文字的效果溺健。
參考:http://blog.csdn.net/lmj623565791/article/details/45059587