RecycleView item点击事件实现,item放大缩小动画布局不变形
来源:互联网 发布:淘宝手机类目保证金 编辑:程序博客网 时间:2024/06/06 02:11
为RecyclerView的每个子item设置setOnClickListener,然后在onClick中再调用一次对外封装的接口,将这个事件传递给外面的调用者。而“为RecyclerView的每个子item设置setOnClickListener”在Adapter中设置。其实直接在onClick中也能完全处理item的点击事件,但是这样会破坏代码的逻辑。
步骤
adapter中
自定义一个继承自RecyclerView.Adapter的MyAdapter。
1.在MyAdapter中定义如下接口,模拟ListView的OnItemClickListener:
2.声明一个这个接口的变量public interface OnItemClickListener { void onItemClick(View view, int position); }
public OnItemClickListener mOnItemClickListener;
3.建MyHolder集成RecycleView.ViewHolder
class SpeedHourHolder extends RecyclerView.ViewHolder { LinearLayout speedView; ImageView speedImage; public SpeedHourHolder(View itemView) { super(itemView); }}
4.在onCreateViewHolder()中绑定holder每个view
@Override public SpeedHourHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.item_project, parent, false); SpeedHourHolder holder = new SpeedHourHolder(view); holder.speedImage = (ImageView) view.findViewById(R.id.speed_image); holder.speedView = (LinearLayout) view.findViewById(R.id.speed_view); return holder; }
5.在onBindViewHolder()方法中设置和item相关的数据,设置item的点击事件,注意在这里设置点击item的动画,可以实现点击的item放大,其余缩放到原位置,注意数据的刷新
@Override public void onBindViewHolder(final SpeedHourHolder holder, final int position) { final ProjectEntity.TopicBean.ItemsBean.ListBean bean = specailList.get(position); if (bean != null) { holder.speedImage.setScaleType(ImageView.ScaleType.FIT_XY); Glide.with(mContext).load(bean.pic).error(R.mipmap.welfare_default_icon).into(holder.speedImage); } if (currentIndex == position) { holder.speedView.setScaleX(1.5f); holder.speedView.setScaleY(1.5f); } else { holder.speedView.setScaleX(1f); holder.speedView.setScaleY(1f); } holder.speedView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mOnItemClickListener != null) { currentIndex = position; notifyDataSetChanged(); mOnItemClickListener.onItemClick(holder.speedView, position); } } }); }
6.最后暴露给外面的调用者,定义一个设置Listener的方法():
public void setOnItemClickListener(OnItemClickListener mOnItemClickLitener) { this.mOnItemClickListener = mOnItemClickLitener; }
以上所有步骤都发生在自定义的adapter中,典型的观察者模式,有点绕的地方在于,这里涉及到两个观察者模式的使用,view的setOnClickListener本来就是观察者模式,我们将这个观察者模式的事件监听传递给了我们自己的观察者模式。
7.在Activity中使用:
private void initAdapter() {
private void initAdapter() { projectAdapter = new ProjectAdapter(this); recyclerView_project.setAdapter(projectAdapter); if (projectEntity != null && projectEntity.topic != null && projectEntity.topic.items != null && projectEntity.topic.items.size() > 0) { List<ProjectEntity.TopicBean.ItemsBean.ListBean> listBeen = projectEntity.topic.items.get(0).list; if (listBeen != null && listBeen.size() > 0) { listBeen.get(2).setPlay(true); mList.addAll(listBeen); projectAdapter.setList(listBeen); } } projectAdapter.setOnItemClickListener(new ProjectAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Toast.makeText(MainActivity.this, "测试中", Toast.LENGTH_SHORT).show(); } }); }完整代码
ProjectAdapter.java
public class ProjectAdapter extends RecyclerView.Adapter<SpeedHourHolder> { private int currentIndex = 2; private List<ProjectEntity.TopicBean.ItemsBean.ListBean> specailList; private LayoutInflater mInflater; private Context mContext = null; public ProjectAdapter(Context context) { this.mContext = context; mInflater = LayoutInflater.from(context); } public void setList(List<ProjectEntity.TopicBean.ItemsBean.ListBean> list) { this.specailList = list; notifyDataSetChanged(); } public OnItemClickListener mOnItemClickListener; public interface OnItemClickListener { void onItemClick(View view, int position); } public void setOnItemClickListener(OnItemClickListener mOnItemClickLitener) { this.mOnItemClickListener = mOnItemClickLitener; } @Override public SpeedHourHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.item_project, parent, false); SpeedHourHolder holder = new SpeedHourHolder(view); holder.speedImage = (ImageView) view.findViewById(R.id.speed_image); holder.speedView = (LinearLayout) view.findViewById(R.id.speed_view); return holder; } @Override public void onBindViewHolder(final SpeedHourHolder holder, final int position) { final ProjectEntity.TopicBean.ItemsBean.ListBean bean = specailList.get(position); if (bean != null) { holder.speedImage.setScaleType(ImageView.ScaleType.FIT_XY); Glide.with(mContext).load(bean.pic).error(R.mipmap.welfare_default_icon).into(holder.speedImage); } if (currentIndex == position) { holder.speedView.setScaleX(1.5f); holder.speedView.setScaleY(1.5f); } else { holder.speedView.setScaleX(1f); holder.speedView.setScaleY(1f); } holder.speedView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mOnItemClickListener != null) { currentIndex = position; notifyDataSetChanged(); mOnItemClickListener.onItemClick(holder.speedView, position); } } }); } @Override public int getItemCount() { return specailList.size(); }}class SpeedHourHolder extends RecyclerView.ViewHolder { LinearLayout speedView; ImageView speedImage; public SpeedHourHolder(View itemView) { super(itemView); }}item.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ptr="http://schemas.android.com/apk/res-auto" android:id="@+id/speed_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:orientation="vertical" android:padding="10dp"> <ImageView android:id="@+id/speed_image" android:layout_width="50dp" android:layout_height="50dp" android:scaleType="fitXY" android:src="@mipmap/speed_icon" /></LinearLayout>MainActivity.java
ContentView(R.layout.activity_main)public class MainActivity extends AppCompatActivity { @ViewInject(R.id.recycler_view) private RecyclerView recyclerView_project; private ProjectEntity projectEntity; private ProjectAdapter projectAdapter = null; private List<ProjectEntity.TopicBean.ItemsBean.ListBean> mList = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); x.view().inject(this); initView(); initData(); initAdapter(); } private void initView() { LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); recyclerView_project.setLayoutManager(linearLayoutManager); } private void initData() { String data = FileUtils.readAssert(this, "speenhour.txt"); projectEntity = JsonUtils.parseJson(data, ProjectEntity.class); } private void initAdapter() { projectAdapter = new ProjectAdapter(this); recyclerView_project.setAdapter(projectAdapter); if (projectEntity != null && projectEntity.topic != null && projectEntity.topic.items != null && projectEntity.topic.items.size() > 0) { List<ProjectEntity.TopicBean.ItemsBean.ListBean> listBeen = projectEntity.topic.items.get(0).list; if (listBeen != null && listBeen.size() > 0) { listBeen.get(2).setPlay(true); mList.addAll(listBeen); projectAdapter.setList(listBeen); } } projectAdapter.setOnItemClickListener(new ProjectAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Toast.makeText(MainActivity.this, "测试中", Toast.LENGTH_SHORT).show(); } }); }}
0 0
- RecycleView item点击事件实现,item放大缩小动画布局不变形
- RecycleView如何实现item的点击事件
- RecycleView的Item点击事件
- RecycleView 添加item点击事件
- Recycleview添加item点击事件
- RecycleView实现混合Item布局
- RecycleView的不同类型Item点击事件
- Android-RecycleView的item点击事件
- RecycleView 列表的item点击事件
- RecycleView多Item布局
- RecycleView的使用,并添加子item的点击事件
- RecycleView不同类型Item&添加HeaderView&条目点击事件
- Android databinding RecycleView item 子控件点击事件
- RecyclerView多布局与Item点击事件
- RecycleView添加item点击效果
- ListView Item点击事件无效,不响应
- ListView的item点击事件不响应
- NavigationView item不响应点击事件
- Ubuntu16.04更换显示器后开始循环登录
- java 获取屏幕的宽高直接调用即可
- 原型链---小白专用
- 排序算法八:归并排序
- Androidstudio支付宝集成
- RecycleView item点击事件实现,item放大缩小动画布局不变形
- nginx源码分析—信号初始化和使用
- [学习笔记01]js基础变量及数据类型
- Android 调用系统API打开闪光灯
- URLConnection抓取万方数据上的文献数据
- aravel-ide-helper的安装方法
- 文件短名转长名
- 啥是web service 和soap?
- 使用Spring注解,在静态方法中注入bean