近期在开发过程中,遇到这样的一个需求:横向列表点击跳转。
也算是几年的老开发,第一个想到的当然是HorizontalListView.
又想到5.0以后出了一个特别好用的RecyclerView,支持ListView的各种展示效果,
所以就研究了一下,发现使用起来特别简单,就开始用RecyclerView控件开发。
首先当然是初始化RecyclerView,除了把默认的垂直布局改为水平布局之外其它的原封不动。
// recycleAdapter=new ProjectRecycleAdapter(this,); LinearLayoutManager layoutManager = new LinearLayoutManager(this); //设置为水平布局。 layoutManager.setOrientation(OrientationHelper.HORIZONTAL); //设置布局管理器 recyclerView.setLayoutManager(layoutManager); //设置Adapter recycleAdapter = new ProjectRecycleAdapter(this); recyclerView.setAdapter(recycleAdapter); //设置增加或删除条目的动画 recyclerView.setItemAnimator(new DefaultItemAnimator());首先遇到的第一个问题,当然是这个控件居然没有OnItemClickListener这个监听。
不过在adapter里针对子布局写了个OnClickListener监听也可以实现。
第二个问题,需求上声明点击横向列表整块布局时跳转。
第一个想到的是给RecyclerView加OnClickListener监听,然而发现加上后也并无卵用。
第二个想到的是给RecyclerView的父控件加OnClickListener监听,并把RecyclerView的ontouch事件屏蔽了。
但是如果把它的ontoch事件屏蔽,RecyclerView自带的横向滑动效果不也失去了么。
然后我就开始重写RecyclerView的ontouch模拟点击。
刚开始想监听到event.ACTION_UP或event.ACTION_DOWN 后直接跳转,但是发现触发太敏感,体验不好。
之后做了改进。并实现点击RecyclerView让后面的TextView跟着点击状态改变按压动作。
recyclerView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Drawable drawable = getResources().getDrawable(R.drawable.back_default);//正常状态 Drawable drawable_pressed = getResources().getDrawable(R.drawable.back_pressed);//按压状态 int w = drawable.getIntrinsicWidth();//图片原始宽度 int h = drawable.getIntrinsicHeight();//图片原始高度 drawable.setBounds(0, 0, w, h); drawable_pressed.setBounds(0, 0, w, h); if (event.getAction() == event.ACTION_DOWN) { scrollX = event.getX(); scrollY = event.getY(); member_num.setTextColor(getResources().getColor(R.color.project_member_pressed)); member_num.setCompoundDrawables(null, null, drawable_pressed, null); } if (event.getAction() == event.ACTION_UP) { member_num.setTextColor(getResources().getColor(R.color.project_member)); member_num.setCompoundDrawables(null, null, drawable, null); if (Math.abs(scrollX - event.getX()) <= 5 && Math.abs(scrollY - event.getY()) <= 5) { Intent intent = new Intent(ProjectDetailActivity.this, ProjectMemberListActivity.class); startActivity(intent); } } return false; } });
希望给遇到同样问题的同学有帮助。谢谢。