學習導航
第一節:http://blog.csdn.net/bobo8945510/article/details/52823539 認識RecyclerView
第二節:http://blog.csdn.net/bobo8945510/article/details/52849084 RecyclerView分割線設定
第三節:http://blog.csdn.net/bobo8945510/article/details/52851558 RecyclerView布局靠左問題
四三節:http://blog.csdn.net/bobo8945510/article/details/52858500 RecyclerView實作監聽
第五節:http://blog.csdn.net/bobo8945510/article/details/52860777 RecyclerView三種不同布局風格
第六節:http://blog.csdn.net/bobo8945510/article/details/52881647 RecyclerView增加和删除效果
RecyclerView監聽的實作

RecyclerView的監聽和listview有很大的差別,listview本身就擁有setOnItemClickListener()方法,RecyclerView不再負責Item視圖的布局及顯示,是以RecyclerView也沒有為Item開放OnItemClick等點選事件。是以我們需要子自己去定義此方法。
和ListView不一樣的是,RecyclerView不再負責Item的擺放等顯示方面的功能。所有和布局、繪制等方面的工作Google都其拆分成不同的類進行管理。是以開發者可以自定義各種各樣滿足定制需求的的功能類。下面是一些和RecyclerView相關的非常重要的類清單。
RecyclerView監聽的實作流程,要和listview差別開
一、我們自己在“擴充卡代碼類中”先去定義一個監聽接口,一個監聽的方法。如圖:
二、由于我添加監聽,是以我們需要ViewHoder去設定控件。如圖:
三、我們在“onBindViewHolder()”方法中去添加監聽。也可以如下圖寫,在其他類中調用,也可以在此直接Toast:
四、我們在“MainActivity”類中引用我們的定義好的監聽方法
五、注意,我們使用的adapter去引用的,而不是RecycleView的對象引用的。要看仔細!
- 适配類中的代碼
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
/**
* Created by ENZ on 2016/10/15.
*/
class ViewHoderAdaapters extends RecyclerView.Adapter {
private Context context;
private String[] datas;
private LayoutInflater inflater;
private OnItemClickListener mOnItemClickListener;
//添加一個OnItemClickListener接口,并且定義兩個方法
public interface OnItemClickListener{
void onClick(int position);
void onLongClick(int position);
}
//然後定義一個監聽的方法,便于主類調用
public void setOnItemListener(OnItemClickListener onItemListener){
this.mOnItemClickListener = onItemListener;
}
//構造方法
public ViewHoderAdaapters(MainActivity mainActivity, String[] data) {
this.context = mainActivity;
this.datas = data;
inflater = LayoutInflater.from(context);
}
@Override
//重寫onCreateViewHolder方法,傳回一個自定義的ViewHolder
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.main_item,parent,false);
ViewHoders viewHoders = new ViewHoders(view);
return viewHoders;
}
@Override
//填充onCreateViewHolder方法傳回的holder中的控件
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
((ViewHoders) holder).tv.setText(datas[position]+position);
//在此方法中來添加監聽,給li_layout控件添加監聽并設定上面我們接口中的兩個方法,在這隻是擷取位置。
//注意,你可以在這裡直接Toast,也可以在主類調用我們的監聽方法。
if(mOnItemClickListener!=null){
((ViewHoders) holder).li_layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,"您點選了第:"+position+"個Item",Toast.LENGTH_SHORT).show();
// mOnItemClickListener.onClick(position);
}
});
((ViewHoders) holder).li_layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClickListener.onLongClick(position);
}
});
}
}
@Override
public int getItemCount() {
return datas.length;
}
//自定義ViewHolder,
/*
* RecylerView封裝了viewholder的回收複用,也就是說RecylerView标準化了ViewHolder,編寫Adapter面向的是ViewHolder而不再是View了
* */
class ViewHoders extends RecyclerView.ViewHolder{
private TextView tv;
private LinearLayout li_layout;
public ViewHoders(View itemView) {
super(itemView);
tv= (TextView) itemView.findViewById(R.id.textview);
li_layout= (LinearLayout) itemView.findViewById(R.id.li_layout);
}
}
}
- 主類代碼
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;
public class MainActivity extends Activity {
private RecyclerView recy_view;
private String[] data ={"我是熊大","我是熊大","我是熊大","我是熊大","我是熊大","我是熊大","我是熊大","我是熊大","我是熊大","我是熊大"};
private ViewHoderAdaapters adaapters;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recy_view= (RecyclerView)findViewById(R.id.recy_view);
LinearLayoutManager LM = new LinearLayoutManager(this);
recy_view.setLayoutManager(LM);
//樣式一,對應類DividerItemDecoration01
// recy_view.addItemDecoration(new DividerItemDecoration01(this,LinearLayoutManager.HORIZONTAL));
//樣式二,對應類DividerItemDecoration02
recy_view.addItemDecoration(new DividerItemDecoration02(this,LinearLayoutManager.HORIZONTAL,R.drawable.style02));
recy_view.setItemAnimator(new DefaultItemAnimator());
adaapters = new ViewHoderAdaapters(MainActivity.this,data);
adaapters.setOnItemListener(new ViewHoderAdaapters.OnItemClickListener() {
public void onLongClick(int position) {
Toast.makeText(MainActivity.this,"您點選了第:"+position+"個Item",Toast.LENGTH_SHORT).show();
}
public void onClick(int position) {
Toast.makeText(MainActivity.this,"您點選了第:"+position+"個Item",Toast.LENGTH_SHORT).show();
}
});
recy_view.setAdapter(adaapters);
}
}
demo位址:http://download.csdn.net/detail/bobo8945510/9657739(帶自定義分割線代碼,承接自上一篇部落格)
demo位址:http://download.csdn.net/detail/bobo8945510/9657739(清理後,不帶自定義分割先代碼,為了讓大家更清晰的了解監聽,是以去掉了自定義部分代碼)