標題: 商城開發筆記-04-RecycleView的基本使用 [打印本頁]
作者: 51黑bing 時間: 2016-3-22 17:18
標題: 商城開發筆記-04-RecycleView的基本使用
一、RecycleView的簡介
RecyclerView是一種新的視圖組,目標是為任何基于適配器的視圖提供相
似的渲染方式。該控件用于在有限的窗口中展示大量數據集,它被作為ListView和GridView控件的繼承者。
那么有了ListView、GridView為什么還需要RecyclerView這樣的控件呢?整體上看RecyclerView架構,提供了一種插拔式的體驗,高度的解耦,異常的靈活,通過設置它提供的不同LayoutManager,ItemDecoration, ItemAnimator實現令人瞠目的效果。
- 你想要控制其顯示的方式,請通過布局管理器LayoutManager
- 你想要控制Item間的間隔(可繪制),請通過ItemDecoration
- 你想要控制Item增刪的動畫,請通過ItemAnimator
- 你想要控制點擊、長按事件,請自己寫(擦,這點尼瑪。)
二、RecycleView的基本使用
1、在Gradle中引入RecycleView的依賴庫。
compile 'com.android.support:recyclerview-v7:23.1.1'
2、在布局文件當中放置我們的RecycleView。
<?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/recycle"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
3、創建適配器類繼承RecycleView的Adapter,步驟為:
- 繼承RecyclerView.Adapter,并且在Adapter里面聲明ViewHolder類繼承RecyclerView.ViewHolder,最后把自己的ViewHolder類丟進自己的Adapter類的泛型中去。
- 在自定義ViewHolder類的構造方法中可以通過ID找到布局的控件,控件需要聲明為自定義ViewHolder類的成員變量。
- 實現RecyclerView.Adapter的所有未實現的函數,onCreateViewHolder主要負責加載布局(加載的時候注意要把父布局寫到參數里去),創建自定義ViewHolder類的對象;onBindViewHolder主要負責把數據設置到Item的控件中;getItemCount主要負責得到數據的數目。
- 最好把數據聲明為成員變量,在構造函數里面傳進來。
- 由于RecycleView原生不支持點擊事件,需要自己添加接口進行回調。
代碼如下:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
List<String> mDatas = null;
Context mContext = null;
//通過構造函數把要顯示的數據讀取進來
public MyAdapter(List<String> mDatas, Context context) {
this.mDatas = mDatas;
this.mContext = context;
}
//相當于ListView中的getView()方法
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// View v = View.inflate(mContext,R.layout.item, null);
LayoutInflater inflater = LayoutInflater.from(mContext);
//加載布局的時候需要注意要把parent傳進去
View v = inflater.inflate(R.layout.layout_item, parent, false);
MyViewHolder holder = new MyViewHolder(v);
return holder;
}
//在這里需要設置顯示的數據
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tv_num.setText(mDatas.get(position));
}
@Override
public int getItemCount() {
return mDatas.size();
}
//自定義ViewHolder必須繼承RecyclerView.ViewHolder,在構造函數中進行ID綁定控件,條目監聽等
class MyViewHolder extendsRecyclerView.ViewHolder {
TextView tv_num;
public MyViewHolder(final View itemView) {
super(itemView);
tv_num = (TextView) itemView.findViewById(R.id.tv_num);
tv_num.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemClickListener != null) {
onItemClickListener.onItemClick(itemView, getLayoutPosition(), mDatas.get(getLayoutPosition()));
}
}
});
}
}
//自定義監聽
private OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener listener) {
this.onItemClickListener = listener;
}
public interface OnItemClickListener {
void onItemClick(View v, int position, String data);
}
public void addData(int position, String data) {
mDatas.add(position, data);
notifyItemInserted(position);
}
public void removeData(int position) {
mDatas.remove(position);
notifyItemRemoved(position);
}
}
4、下面是MainActivity中需要進行的處理。核心的步驟(某些步驟可不分先后)如下:
- 通過ID找到RecyclerView。
- RecyclerView設置Adapter。
- RecyclerView設置布局管理器,常用的布局管理器有LinearLayoutManager:線性布局,LayoutManager的實現類,類型包括Vertical和HorizontalGridLayoutManager;格子布局,繼承自LinearLayoutManager,實現效果類似GridView;StaggeredGridLayoutManager交錯的格子布局,同樣也是LayoutManager的實現類,類型包括Vertical和Horizontal,與GridLayoutManager很相似,不過是交錯的格子,也就是寬高不等的格子視圖,類似瀑布流的效果。
- RecyclerView設置數據插入、刪除的時候的動畫效果,這里使用默認的。下面的網址是GitHub上面的開源動畫效果:https://github.com/gabrielemariotti/RecyclerViewItemAnimators
- RecyclerView設置Item之間的裝飾器,這里也是使用GitHub提供的裝飾器,代碼會在附件中給出。
代碼如下:
public class MainActivity extendsAppCompatActivity {
List<String> datas = null;
private RecyclerView recyclerView;
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
recyclerView = (RecyclerView) findViewById(R.id.recycle);
//設置RecycleView的適配器
myAdapter = new MyAdapter(datas, this);
recyclerView.setAdapter(myAdapter);
//設置布局管理器,以渲染出不同的效果
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//設置插入、刪除數據的動畫效果(這里使用默認的動畫)
recyclerView.setItemAnimator(new DefaultItemAnimator());
//設置每個Item之間的裝飾(這里設置為分隔線)
recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
//設置條目監聽,需要自定義接口
myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
@Override
public void onItemClick(View v, int position, String data) {
Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();
}
});
}
private void initData() {
datas = new ArrayList<>();
for (int i = 0; i < 300; i++) {
datas.add(i + "");
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_add:
myAdapter.addData(0, "new data");
recyclerView.scrollToPosition(0);
break;
case R.id.action_delete:
myAdapter.removeData(0);
break;
case R.id.action_gridview:
recyclerView.setLayoutManager(new GridLayoutManager(this, 4));
break;
case R.id.action_listview:
recyclerView.setLayoutManager(new LinearLayoutManager(this));
break;
case R.id.action_staggeredgridview:
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,
StaggeredGridLayoutManager.VERTICAL));
break;
}
return true;
}
}
三、運行效果
先上圖三張,具體的一些動畫效果需要自己體會。
對啦,notifyDataSetChanged方法以及棄用了,請注意RecycleView的新規矩:
notifyDataSetChanged()棄用
notifyItemChanged(intposition)
notifyItemInserted(intposition)
notifyItemMoved(intfromPosition, int toPosition)
notifyItemRemoved(intposition)
//range系列,多個item的操作
notifyItemRangeChanged(intpositionStart, int itemCount)
notifyItemRangeInserted(intpositionStart, int itemCount)
notifyItemRangeRemoved(intpositionStart, int itemCount)
補充:可以通過Adapter的getViewType(intposition)方法實現多種不同的條目。
具體做法是根據position的不同例如奇數偶數,或者特定值,然后根據viewType參數的不同去inflate不同的item布局即可。
如下圖所示:
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
99热在线免费观看
|
日韩免费高清视频
|
视频在线一区
|
91精品国产一区二区三区
|
一级黄片毛片
|
一区二区黄色
|
久久久久久爱
|
久久久久黄色
|
久久成人国产
|
亚洲视频国产
|
国产精品久久久久久久免费看
|
人人综合
|
国产精品免费人成网站酒店
|
成人激情视频在线观看
|
日本国产欧美
|
天天拍夜夜操
|
亚洲视频在线看
|
欧洲精品一区二区
|
国产精品成人免费视频
|
伊人亚洲综合
|
日本免费黄色网址
|
日韩av影片
|
午夜在线视频观看日韩17c
|
视频爱爱免费视频爱爱太爽
|
久久久久免费视频
|
日韩一区在线播放
|
91福利片|
欧美日韩国产中文字幕
|
又黄又爽又色视频
|
国产精品久久久一区二区
|
午夜视频免费观看
|
色妞色视频一区二区三区四区
|
日本亚洲欧美
|
亚洲黄色网址
|
在线视频一区二区三区
|
久久综合久色欧美综合狠狠
|
久久久久久久网站
|
国产精品区二区三区日本
|
国产成人福利
|
久久久久久久久久国产精品
|
亚洲天堂v
|