解决listview的item为自定义viewgroup时,viewgroup子view press时,整个viewgroup都被按下的问题
2013-04-22 11:41
639 查看
在开发过程中,遇到一个问题,listview的getview方法,返回的view是一个自定义的viewgroup,该viewgroup根据服务器返回的数据动态组合子view,当然每个子view按下的时候背景色需要变换,这个是通过为布局添加selector实现的,selector中只是简单区分了state_pressed的状态,分别给与图片,遇到的问题是,当按下子view的时候整个viewgroup背景色都变化了,想到的第一个问题就是touch事件的分发,于是弄了半天touch,改好了一版,但是有个问题就是,可能不是在按下的时候
背景色也会变一下,因为重写了touch时间的action_down,后来找到一个和press相关的api,遂把最终解决方案记录下,由于默认的dispatchSetPressed方法是 分发给了所有的子view,故需要重写:
1.重写viewgroup的 protected void dispatchSetPressed(boolean pressed)方法:protected void dispatchSetPressed(boolean pressed) {
if (pressed) {
String tag = "";
for (int i = 0; i < vCard.getChildCount(); i++) {
ViewGroup viewGroup = (ViewGroup) vCard.getChildAt(i);
tag = (String) viewGroup.getTag();
if (tag != null && tag.equals("1")) {
viewGroup.setPressed(pressed);
}
}
} else {
String tag = "";
for (int i = 0; i < vCard.getChildCount(); i++) {
ViewGroup viewGroup = (ViewGroup) vCard.getChildAt(i);
tag = (String) viewGroup.getTag();
if (tag != null && tag.equals("1")) {
viewGroup.setPressed(pressed);
viewGroup.setTag("0");
}
}
}
}
2.对子view进行tag设定,这需要重写子view的 public boolean onTouchEvent(MotionEvent event) 方法:
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
setTag("1");
}
if (event.getAction() == MotionEvent.ACTION_CANCEL) {
setTag("0");
}
if (event.getAction() == MotionEvent.ACTION_UP) {
setTag("0");
}
return super.onTouchEvent(event);
}
3.重写viewgroup的 public boolean onTouchEvent(MotionEvent event) 方法,目的是由于同一个子view可能会重复添加到viewgroup,故需要排他,当找到其中有tag为1的时候,其他所有子view的tag设为0。
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean isTouched = false;
int position = 0;
if (event.getAction() == MotionEvent.ACTION_DOWN) {
for (int i = 0; i < vCard.getChildCount(); i++) {
View childView = vCard.getChildAt(i);
String tag = (String) childView.getTag();
if (tag != null && tag.equals("1")) {
isTouched = true;
position = i;
break;
}
}
if (isTouched) {
for (int i = 0; i < vCard.getChildCount(); i++) {
if (i == position) {
continue;
}
View childView = vCard.getChildAt(i);
childView.setTag("0");
}
}
} else if (event.getAction() == MotionEvent.ACTION_CANCEL
|| event.getAction() == MotionEvent.ACTION_UP) {
for (int i = 0; i < vCard.getChildCount(); i++) {
View childView = vCard.getChildAt(i);
childView.setTag("0");
}
}
return super.onTouchEvent(event);
}
经过测试,达到了预期的需求,效果还可以,有问题还望耐心指正,新手..
相关文章推荐
- ExpandableListView group和child的item间距设置以及多种布局等问题的解决
- 自定义viewpager解决listview和viewpager滑动冲突的问题
- 解决 ListView的Item里TextView设置超链接后ListView 的OnItemClick失效的问题
- 解决listView或者recycleView 的item有CheckBox复用问题
- Android BaseAdapter和ViewHolder 优化 解决ListView的item抢焦点问题和item错乱问题
- android 自定义ListView 使其带单选框按钮,并解决item点击不响应的问题
- 解决ListView中getChildAt(int index)获取item的view为null的问题
- 解决自定义RefrePullListview加入HeaderView占去position=0的问题
- 自定义TextView,解决文字换行,\n换行符换行,导致高度计算不对问题(计算ListView高度)
- android 自定义TextView支持微博功能后在ListView占用了Item点击的解决办法
- 解决ListView的ItemView中带有Button时,OnItemClick无效的问题
- 解决listview item Textview加超链接 超链接以外部分不响应listview item点击事件问题
- 自定义SwipeRefreshLayout 嵌套listview 并解决item点击事件焦点冲突问题
- ListView GridView 自定义ViewGroup的单个item 刷新 和 单个item中的局部元素刷新
- Qt listview 采用自定义model选择时会选择多个item的问题解决
- Android中ListView点击和ListView的item里面的Button或ImageView不能同时生效问题的解决
- android 自定义ListView 使其带单选框按钮,并解决item点击不响应的问题
- RecyclerView 横向的listview 直接解决你的自定义问题
- android 自定义TextView支持微博功能后在ListView占用了Item点击的解决办法
- android 自定义ListView 使其带单选框按钮,并解决item点击不响应的问题