Android中由于ListView和GridView功能的不健全京办,特別是列表緩存設(shè)置問(wèn)題是由我們自己去設(shè)置的惭婿,因此谷歌又添加了一個(gè)組件 RecyclerView财饥,這個(gè)組件非常強(qiáng)悍,可以同時(shí)實(shí)現(xiàn)列表和表格橫縱向排序沾瓦,還有瀑布流的展現(xiàn)谦炒,但是有個(gè)缺點(diǎn)就是沒(méi)有提供點(diǎn)擊事件給我們宁改,案例會(huì)給出还蹲,還有值得注意的是它放在 v7 包中,因此使用之前記得引入相關(guān)類(lèi)庫(kù)潭兽;話(huà)不多說(shuō)讼溺,開(kāi)搞:
一、添加 v7 包中所依賴(lài)的 RecyclerView 組件
右鍵 app 點(diǎn)后選擇 “Open Module Settings”藻懒,然后 "Dependencies"嬉荆,接下來(lái) “Library dependency”,然后選擇組件即可:
這里需要注意的是限番,組件版本必須要和我們環(huán)境的配置版本一樣弥虐,如圖:
二珠插、在布局文件中添加我們的組件:
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
三捻撑、聲明相應(yīng)的組件及集合數(shù)據(jù)對(duì)象之后設(shè)置窗體源代碼如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView(); // 初始化組件
initData(); // 初始化數(shù)據(jù)
setData(); // 適配器綁定數(shù)據(jù)
setRvTypeAndListener(); //設(shè)置類(lèi)型組件及監(jiān)聽(tīng)事件
}
四顾患、前三個(gè)方法的實(shí)現(xiàn)如下:
//初始化方法
private void initView() {
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
}
//初始化數(shù)據(jù)的方法
private void initData() {
datas = new ArrayList<>();
//準(zhǔn)備數(shù)據(jù)
for(int i = 0; i < 100; i++){
datas.add("Content_"+ i);
}
}
//設(shè)置適配器
private void setData() {
//設(shè)置適配器
adapter = new MyRecyclerViewAdapter(this, datas);
recyclerView.setAdapter(adapter);
}
五、創(chuàng)建一個(gè)名為 MyRecyclerViewAdapter 并且使其 繼承自 RecyclerView 自身的適配器(注意:這里適配器泛型是存放 自定義內(nèi)部類(lèi)的組件容器):
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
private Context mContext;
private List<String> datas;
public MyRecyclerViewAdapter(Context mContext, List<String> datas) {
this.mContext = mContext;
this.datas = datas;
}
//相當(dāng)于 getView 方法中創(chuàng)建 View 和 ViewHolder
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = View.inflate(mContext, R.layout.item_recyclerview, null);
return new MyViewHolder(itemView);
}
//數(shù)據(jù) 和 View綁定 训堆,相當(dāng)于 getView 綁定數(shù)據(jù)部分的代碼
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
//根據(jù)位置得到對(duì)應(yīng)的數(shù)據(jù)
String data = datas.get(position);
holder.tv_title.setText(data);
}
//得到總條數(shù)
@Override
public int getItemCount() {
return datas.size();
}
//內(nèi)部組件容器類(lèi)
class MyViewHolder extends RecyclerView.ViewHolder {
public MyViewHolder(View itemView) {
super(itemView);
}
}
}
六描验、創(chuàng)建出 item_recyclerview.xml 選項(xiàng)文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:padding="5dp"
android:background="#fff">
<LinearLayout
android:padding="5dp"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="#22000000">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"/>
<TextView
android:id="@+id/tv_title"
android:layout_marginLeft="30dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Content"
android:textAllCaps="false"
android:textColor="#000000"/>
</LinearLayout>
</RelativeLayout>
七、將內(nèi)部容器類(lèi)修改如下:
class MyViewHolder extends RecyclerView.ViewHolder {
private ImageView iv_icon;
private TextView tv_title;
public MyViewHolder(View itemView) {
super(itemView);
iv_icon = (ImageView) itemView.findViewById(R.id.iv_icon);
tv_title = (TextView) itemView.findViewById(R.id.tv_title);
}
}
八坑鱼、接下來(lái)我們實(shí)現(xiàn) setRvTypeAndListener() 方法 <如不設(shè)置此方法中的代碼則組件無(wú)法顯示數(shù)據(jù)>:
//設(shè)置組件的樣式
private void setRvTypeAndListener() {
//LayoutManager 設(shè)置樣式組件
//設(shè)置成 列表
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true)); //上下文膘流、方向、是否倒序
//recyclerView.scrollToPosition(datas.size()-1); //指定顯示的位置
//設(shè)置成表格
//recyclerView.setLayoutManager(new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false)); //上下文鲁沥、列數(shù)呼股、方向、是否倒序
//recyclerView.scrollToPosition(datas.size()-1);
//設(shè)置成瀑布流
//recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)); // 列數(shù)画恰、方向
}
運(yùn)行效果圖如下(注:可自行修改顯示格式):
九、由于 RecyclerView 不想 ListView 和 GridView 那樣有自帶的點(diǎn)擊事件狭园,因此點(diǎn)擊事件必須要由我們自己去設(shè)置,我們直接在 MyViewHolder 構(gòu)造方法中為 選項(xiàng)對(duì)象設(shè)置點(diǎn)擊事件即可:
public MyViewHolder(View itemView){
super(itemView);
iv_icon = (ImageView) itemView.findViewById(R.id.iv_icon);
tv_title = (TextView) itemView.findViewById(R.id.tv_title);
//添加點(diǎn)擊事件
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "當(dāng)前點(diǎn)擊 "+ datas.get(getLayoutPosition()), Toast.LENGTH_SHORT).show();
}
});
}
我們運(yùn)行程序效果如下:
十粥脚、當(dāng)然铭拧,如果覺(jué)得在適配器里設(shè)置比較麻煩不夠靈活的話(huà)即我們想使用 適配器對(duì)象 設(shè)置呕臂,那如何實(shí)現(xiàn)呢?很簡(jiǎn)單谜洽,我們?cè)谶m配器里定義接口蚌卤,然后回調(diào)出去即可實(shí)現(xiàn)我們的點(diǎn)擊事件咸灿,在適配器里 創(chuàng)建內(nèi)部的 接口及 回調(diào)方法 :
//點(diǎn)擊 RecyclerView 某條的監(jiān)聽(tīng)
public interface OnItemClickListener{
/**
* 當(dāng)RecyclerView某個(gè)被點(diǎn)擊的時(shí)候回調(diào)
* @param view 點(diǎn)擊item的視圖
* @param data 點(diǎn)擊得到的數(shù)據(jù)
*/
void onItemClick(View view, String data);
}
private OnItemClickListener onItemClickListener;
/**
* 設(shè)置RecyclerView某個(gè)的監(jiān)聽(tīng)
* @param onItemClickListener
*/
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.onItemClickListener = onItemClickListener;
}
十一囊榜、定義好之后,我們將選項(xiàng)對(duì)象的點(diǎn)擊事件修改如下:
//添加點(diǎn)擊事件
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(mContext, "當(dāng)前點(diǎn)擊 "+ datas.get(getLayoutPosition()), Toast.LENGTH_SHORT).show();
if(onItemClickListener != null){
onItemClickListener.onItemClick(v, datas.get(getLayoutPosition()));
}
}
});
十二、然后返回源文件并將 setRvTypeAndListener() 方法做如下修改即可:
//設(shè)置組件的樣式
private void setRvTypeAndListener() {
//LayoutManager 設(shè)置樣式組件
//設(shè)置成 列表
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true)); //上下文、方向、是否倒序
//recyclerView.scrollToPosition(datas.size()-1);
//設(shè)置成表格
//recyclerView.setLayoutManager(new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false)); //上下文挣菲、列數(shù)椭赋、方向、是否倒序
//recyclerView.scrollToPosition(datas.size()-1);
//設(shè)置成瀑布流
// recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)); // 列數(shù)认境、方向
adapter.setOnItemClickListener(new MyRecyclerViewAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, String data) {
Toast.makeText(MainActivity.this, "點(diǎn)擊-> "+ data, Toast.LENGTH_SHORT).show();
}
});
}
運(yùn)行效果如下:
值得注意的是:如果我們給選項(xiàng)添加長(zhǎng)按事件或者為某個(gè)組件添加點(diǎn)擊事件而已的話(huà)硼身,其做法和剛剛剛設(shè)置的 點(diǎn)擊事件 一個(gè)原理,在適配器中做相應(yīng)的設(shè)置即可....
好了,這個(gè)案例就寫(xiě)到這里巍糯,順便附上源碼 - >
鏈接:https://pan.baidu.com/s/1rwaoesCMprS36qz9NNZxnQ 密碼:pti7
有疑問(wèn)可隨時(shí)留言哦a阌恪Q嵫谩!嘿嘿喻杈。。盟猖。