关于在RecyclerView中添加点击事件,已经有无数的博客了,我之所以还要写一遍,主要是为了自己加深影响。
RecyclerView的好用之处比起ListView和GridView来说就太多了,这里也不在赘述,而不同之处是RecyclerView没有item的点击事件,所以这里实现方式是模仿ListView的item点击事件,构造一个自定义的点击事件来。
一、在自定义的adapter中定义接口OnItemClickListener。
public static interface OnItemClickListener{
void onItemClick(View view, int position);
}
同时,声明这个接口的变量:
private OnItemClickListener mOnItemClickListener = null;
(这里需要注意的地方是,要implement OnclickListener)
二、在onCreateViewHolder中添加每个item的点击事件。
view.setOnClickListener(this);
然后在onClick方法中进行position的获取
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
//注意这里使用getTag方法获取position
mOnItemClickListener.onItemClick(v,(int)v.getTag());
}
}
因为在这里调用了getTag方法,所以要在onBindViewHolder方法中进行setTag的设置,不然你就不会知道position怎么来的了。holder.itemView.setTag(position);
三、设置一个方法,给activity来调用。
public void setOnItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
四、activity中对item的操作
mAdapter.setOnItemClickListener(new AppsAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Intent intent = new Intent(StopRunActivity.this, AppManagementActivity.class);
intent.putExtra("name", mAppInfoList.get(position).getPackageName());
//intent.putExtra("position", position);
startActivity(intent);
Toast.makeText(StopRunActivity.this, mAppInfoList.get(position).getPackageName(), Toast.LENGTH_SHORT).show();
finish();
}
});
这里的具体操作忽略,我们可以获得两个参数,一个是view,另一个是position。因为很多时候,我们都是对各种类型的数组进行操作,获得相关的position
就足够来进行相关的操作了。
补:
删除item子控件之后获取焦点问题:
每次删除item,都会重新加载一次onBindViewHolder()方法,重新排布一下子item的position。
我们这里设置每次重新加载的时候,都将position = 0 获得焦点,代码如下:
holder.itemView.setFocusable(true);
if (position == 0) {
Log.d(TAG, "requestFocus");
holder.itemView.requestFocus();
}
首先设置itemview可以获得焦点,
然后让position = 0 获取焦点 即可。