android RecyclerView响应点击事件
16lz
2021-01-26
上篇简单介绍了 RecyclerView 的用法,说到RecyclerView 中没有提供 OnItemClickListener 和 OnItemLongClickListener 的监听事件,也就是说,我们要自己在adapter里面写接口实现。
RecyclerView 要想实现响应事件,需要自定义监听器//实现RecyclerView响应事件的步骤//1.声明一个借口,定义响应事件的方法//2.在RecyclerView的Adapter内来维护(声明)一个接口对象//3.在OnBindViewHolder方法中对Item设置点击事件监听,并将事件传递给接口对象//4.在mainActivity中实现接口并重写方法实现内容
现在我们来看一看怎么实现RecyclerView 的点击事件:
首先定义两个接口:
第一个,MyOnItemClickListener.java,响应 RecyclerView item的点击事件:
import android.view.View;/** * item点击接口 */public interface MyOnItemClickListener { void OnItemClickListener(View view, int position);}
第二个,MyOnItemLongClickListener.java,响应 RecyclerView item的长按事件:
import android.view.View;/** * item长按接口 */public interface MyOnItemLongClickListener { void OnItemLongClickListener(View view, int position);}
然后在MyRecyclerViewAdapter里面声明这两个接口,定义两个方法,用来让adapter在Activity里面回调,并在onBindViewHolder中给item设置监听:
定义的方法:
/** * 列表点击事件 * * @param itemClickListener */ public void setOnItemClickListener(MyOnItemClickListener itemClickListener) { this.itemClickListener = itemClickListener; } /** * 列表长按事件 * * @param itemLongClickListener */ public void setOnItemLongClickListener(MyOnItemLongClickListener itemLongClickListener) { this.itemLongClickListener = itemLongClickListener; }
onBindViewHolder中:
/*自定义item的点击事件不为null,设置监听事件*/ if (itemClickListener != null) { myViewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { itemClickListener.OnItemClickListener(myViewHolder.itemView, myViewHolder.getLayoutPosition()); } }); } /*自定义item的长按事件不为null,设置监听事件*/ if (itemLongClickListener != null) { myViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { itemLongClickListener.OnItemLongClickListener(myViewHolder.itemView, myViewHolder.getLayoutPosition()); return true; } }); }
最后在Activity里面调用setOnItemClickListener和setOnItemLongClickListener就可以了。
下面看完整代码:
MyRecyclerViewAdapter.java
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.TextView;import java.util.List;/** * Created by jia on 2015/10/16. */class MyRecyclerViewAdapter extends RecyclerView.Adapter { private Context context; private List list; private MyOnItemClickListener itemClickListener; private MyOnItemLongClickListener itemLongClickListener; public MyRecyclerViewAdapter(Context context, List list) { this.context = context; this.list = list; } /** * onCreateViewHolder中负责为Item创建视图 * * @param viewGroup * @param i * @return */ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { /*初始化填充RecyclerView的item*/ View viewItem = LayoutInflater.from(context).inflate(R.layout.list_item, viewGroup, false); /*返回自定义的ViewHolder*/ MyViewHolder myViewHolder = new MyViewHolder(viewItem); return myViewHolder; } /** * onBindViewHolder负责将数据绑定到Item的视图上。 * * @param viewHolder * @param position */ @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { /*将接收到的ViewHolder强转成自定义的VIewHolder*/ final MyViewHolder myViewHolder = (MyViewHolder) viewHolder; /*为Item设置数据*/ myViewHolder.getIdView().setText(list.get(position)); myViewHolder.getNameView().setText("name"); /*自定义item的点击事件不为null,设置监听事件*/ if (itemClickListener != null) { myViewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { itemClickListener.OnItemClickListener(myViewHolder.itemView, myViewHolder.getLayoutPosition()); } }); } /*自定义item的长按事件不为null,设置监听事件*/ if (itemLongClickListener != null) { myViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { itemLongClickListener.OnItemLongClickListener(myViewHolder.itemView, myViewHolder.getLayoutPosition()); return true; } }); } } /** * 本方法决定了绘制item的数量 * * @return */ @Override public int getItemCount() { return list.size(); } /** * 列表点击事件 * * @param itemClickListener */ public void setOnItemClickListener(MyOnItemClickListener itemClickListener) { this.itemClickListener = itemClickListener; } /** * 列表长按事件 * * @param itemLongClickListener */ public void setOnItemLongClickListener(MyOnItemLongClickListener itemLongClickListener) { this.itemLongClickListener = itemLongClickListener; } class MyViewHolder extends RecyclerView.ViewHolder { private TextView idView; private TextView nameView; public MyViewHolder(View itemView) { super(itemView); idView = (TextView) itemView.findViewById(R.id.id); nameView = (TextView) itemView.findViewById(R.id.name); } public TextView getIdView() { return idView; } public TextView getNameView() { return nameView; } }}
MainActivity.java
import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import android.view.View;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends ActionBarActivity { private RecyclerView recyclerView; private MyRecyclerViewAdapter adapter; private List list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); initData(); /* * 初始化一个布局管理器,这里是默认的竖直线性,效果如上图所示 * 其实完整写法为: * LinearLayoutManager manager = new LinearLayoutManager(context, orientation, reverseLayout); * 其中三个参数分别表示: * 1.context:上下文 * 2.orientation:布局方向; * LinearLayoutManager.VERTICAL:竖直方向(默认) * LinearLayoutManager.HORIZONTAL:水平方向 * 3.reverseLayout:布局数据是否反向;false:正常(默认);true:反向; * 下边的写法就相当于:new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); */ LinearLayoutManager manager = new LinearLayoutManager(this); recyclerView.setLayoutManager(manager); adapter = new MyRecyclerViewAdapter(MainActivity.this, list); recyclerView.setAdapter(adapter); /*点击事件*/ adapter.setOnItemClickListener(new MyOnItemClickListener() { @Override public void OnItemClickListener(View view, int position) { Toast.makeText(getApplicationContext(), "position" + position + "被点击", Toast.LENGTH_SHORT).show(); } }); /*长按事件*/ adapter.setOnItemLongClickListener(new MyOnItemLongClickListener() { @Override public void OnItemLongClickListener(View view, int position) { /*长按删除*/ list.remove(position); adapter.notifyItemRemoved(position); } }); } /** * 初始化集合,添加数据 */ private void initData() { list = new ArrayList<>(); for (int i = 0; i < 100; i++) { list.add("id:" + i); } }}
再加上上边定义的两个接口,就完整了,接口也可以在Adapter中定义。
更多相关文章
- Android使用ListView构造复杂界面,响应点击事件,通过Intent跳转act
- Android开发 第2课 控件TextView、Plain Text、ImageView、 Butt
- Android(安卓)IPC之Binder连接池BinderPool
- Android(安卓)LifeCycle监控生命周期
- Android(安卓)使用RecyclerView实现轮播图
- Android(安卓)Netd ndc
- binder 实例分析
- EventBus
- Android(安卓)RecyclerView单击、长按事件:基于OnItemTouchListe