RecyclerView 的每一個Item的點擊事件並無像ListView同樣封裝在組件中,須要Item的單擊事件時就須要本身去實現,在Adapter中爲RecyclerView添加單擊事件參考以下:java
RecyclerView的使用方法請參考:RecyclerView的簡單使用segmentfault
在RecyclerView的Adapyer中定義單擊事件的回調接口:ide
/** * 定義RecyclerView選項單擊事件的回調接口 */ public interface OnItemClickListener{ //參數(父組件,當前單擊的View,單擊的View的位置,數據) void onItemClick(RecyclerView parent,View view, int position, String data); }
在RecyclerView的Adapyer中聲明該接口,並提供setter方法:佈局
private OnItemClickListener onItemClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener){ this.onItemClickListener = onItemClickListener; }
在RecyclerView的Adapyer類實現View.OnClickListener接口,並重寫onClick(View view)方法,而後設置給接口的事件監聽:學習
public class RvAdapter1 extends RecyclerView.Adapter<RvAdapter1.DataViewHolder> implements View.OnClickListener{ ... view.setOnClickListener(this);//設置監聽器 ... @Override public void onClick(View view) { //根據RecyclerView得到當前View的位置 int position = recyclerView.getChildAdapterPosition(view); //程序執行到此,會去執行具體實現的onItemClick()方法 if (onItemClickListener!=null){ onItemClickListener.onItemClick(recyclerView,view,position,mList.get(position)); } } ... }
在MainActivity中經過Adapter設置每一個Item的單擊事件:this
adapter.setOnItemClickListener(new RvAdapter1.OnItemClickListener() { @Override public void onItemClick(RecyclerView parent, View view, int position, String data) { Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show(); } });
/** * Created by jzman on 2017/5/13 0013. * RecycleView的Adapter */ public class RvAdapter1 extends RecyclerView.Adapter<RvAdapter1.DataViewHolder> implements View.OnClickListener{ private Context mContext; private RecyclerView recyclerView; private ArrayList<String> mList; public RvAdapter1() {} public RvAdapter1(Context mContext, ArrayList<String> mList) { this.mContext = mContext; this.mList = mList; } /** * 用於建立ViewHolder * @param parent * @param viewType * @return */ @Override public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.item,null); view.setOnClickListener(this); //使用代碼設置寬高(xml佈局設置無效時) view.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); DataViewHolder holder = new DataViewHolder(view); return holder; } /** * 綁定數據 * @param holder * @param position */ @Override public void onBindViewHolder(DataViewHolder holder, int position) { holder.tv_data.setText(mList.get(position)); } /** * 選項總數 * @return */ @Override public int getItemCount() { return mList.size(); } @Override public void onClick(View view) { //根據RecyclerView得到當前View的位置 int position = recyclerView.getChildAdapterPosition(view); //程序執行到此,會去執行具體實現的onItemClick()方法 if (onItemClickListener!=null){ onItemClickListener.onItemClick(recyclerView,view,position,mList.get(position)); } } /** * 建立ViewHolder */ public static class DataViewHolder extends RecyclerView.ViewHolder{ TextView tv_data; public DataViewHolder(View itemView) { super(itemView); tv_data = (TextView) itemView.findViewById(R.id.tv_recycle); } } private OnItemClickListener onItemClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener){ this.onItemClickListener = onItemClickListener; } /** * 定義RecyclerView選項單擊事件的回調接口 */ public interface OnItemClickListener{ //參數(父組件,當前單擊的View,單擊的View的位置,數據) void onItemClick(RecyclerView parent,View view, int position, String data); } /** * 將RecycleView附加到Adapter上 */ @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); this.recyclerView= recyclerView; } /** * 將RecycleView從Adapter解除 */ @Override public void onDetachedFromRecyclerView(RecyclerView recyclerView) { super.onDetachedFromRecyclerView(recyclerView); this.recyclerView = null; } }
/** * Created by jzman on 2017/5/13 0013. */ public class MainActivity extends AppCompatActivity { private RecyclerView rv; RvAdapter1 adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rv = (RecyclerView) findViewById(R.id.rv); //設置佈局管理器 // rv.setLayoutManager(new LinearLayoutManager(this));//線性 rv.setLayoutManager(new GridLayoutManager(this,4));//線性 // rv.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));//線性 adapter = new RvAdapter1(this,initData()); adapter.setOnItemClickListener(new RvAdapter1.OnItemClickListener() { @Override public void onItemClick(RecyclerView parent, View view, int position, String data) { Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show(); } }); rv.setAdapter(adapter); } public static ArrayList<String> initData(){ ArrayList<String> arrayList = new ArrayList<>(); for (int i=0;i<50;i++){ arrayList.add("第"+i+"條數據"); } return arrayList; } }
若是以爲有幫助,能夠選擇關注公衆號:jzman-blog,一塊兒交流學習。spa