RecyclerView 的每一個Item的點擊事件並無像 ListView 同樣封裝在組件中,須要 Item 的單擊事件時就須要本身去實現,在 Adapter 中爲RecyclerView 添加單擊事件參考以下:java
RecyclerView的使用方法請參考:RecyclerView的簡單使用微信
在 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