我遇到一个很奇葩的问题,关于listview.setVisibility(View.GONE);竟然不起作用

qq_16110639 2017-05-10 11:36:11
开发中遇到一个小问题,再点击事件中,listview.setVisibility(View.GONE);竟然不起作用,listview.setVisibility(View.VISIBLE);却正常。代码如下:

public class TechnicianDetailActivity extends BaseActivity {
@BindView(R.id.main_back)
TextView main_back;
@BindView(R.id.main_refuse)
TextView main_refuse;
@BindView(R.id.img_head)
XCRoundImageView img_head;
@BindView(R.id.tv_name)
TextView tv_name;
@BindView(R.id.tv_phone)
TextView tv_phone;
@BindView(R.id.tv_sex)
TextView tv_sex;
@BindView(R.id.tv_level)
TextView tv_level;
@BindView(R.id.tv_click)
TextView tv_click;
@BindView(R.id.mylist)
MyListView mylist;
@BindView(R.id.ll_skill)
LinearLayout ll_skill;
private PopupWindow popupWindow;

@OnClick(R.id.main_back)
void main_back() {
finish();
}

@OnClick(R.id.main_refuse)
void main_refuse() {
showRefusePopwindow(this, main_refuse, contactsChildBeen.getUSER_NAME());
}

private ContactsChildBean contactsChildBeen;
private RequestBean requestBean;
private String JS_SKILLS = "";
private String[] skills = null;
List<String> list = new ArrayList<String>();
private SkillsAdapter skillsAdapter;
private Boolean isShow = false;

@Override
public void initView() {
contactsChildBeen = (ContactsChildBean) getIntent().getExtras().get("DETAIL");
tv_name.setText(contactsChildBeen.getUSER_NAME());
tv_phone.setText(contactsChildBeen.getMOBILE());

JS_SKILLS = contactsChildBeen.getJS_SKILLS();
skills = JS_SKILLS.split(",");
list.clear();
for (int i = 0; i < skills.length; i++) {
list.add(skills[i].toString());
}
Log.d("chengjie", list + "");
skillsAdapter = new SkillsAdapter(this, list);
mylist.setAdapter(skillsAdapter);
}

@OnClick(R.id.ll_skill)
void ll_skill() {
if (isShow){
mylist.setVisibility(View.GONE);
isShow=false;
tv_click.setText("点击展开");
}else{
mylist.setVisibility(View.VISIBLE);
isShow=true;
skillsAdapter.notifyDataSetChanged();
tv_click.setText("点击收起");
}
}


@Override
public int getLayoutId() {
return R.layout.activity_technician_detail;
}
}
}


public class MyListView extends ListView {

public MyListView(Context context) {
super(context);
}

public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}


布局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/main_bg"
android:orientation="vertical">

<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/list_item_margin_left_right"
android:layout_marginTop="@dimen/margin_top"
android:layout_marginLeft="@dimen/list_item_margin_left_right"
android:background="@color/white"
android:orientation="vertical">

<LinearLayout
android:id="@+id/ll_skill"
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="专业特长"
android:layout_gravity="center"
android:gravity="left"
android:textSize="@dimen/list_item_text_size"
android:textColor="@color/main_middle_title_text_color"/>
<TextView
android:id="@+id/tv_click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击收起"
android:layout_gravity="center"
android:textSize="@dimen/list_item_text_size"
android:textColor="@color/main_color"/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/line" />
<com.orioc.liftboss.widget.MyListView
android:id="@+id/mylist"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/margin_right"
android:layout_marginLeft="@dimen/margin_left"
android:visibility="visible"/>

</LinearLayout>
</ScrollView>
</LinearLayout>

我在点击LinearLayout时字体确实变了,但是listview却没有隐藏,我也debug一下,代码也都运行了,但就是不隐藏,把GONE改为INVISIBLE后,listview的内容隐藏了,背景还在,但我要求的是listview隐藏,如果在布局文件中先设置隐藏的话,点击后会显示出来,但是在点击就没反应了,求各位大神看看这是什么问题?
...全文
783 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Demons_by 2017-05-12
  • 打赏
  • 举报
回复
兄弟。。我用你的写法测试了下,结果没出现你的问题。。 在给自定义listview设置为GONE的时候,onMeasure方法没有执行,所以这里应该不是原因。。由于我这边是好用的,所以你这里不行的原因我挺难定位的。你可以试试clean项目,这招对一些奇怪的问题屡试不爽=。= 我也能大概知道你这个页面的需求是什么,就是多个一级目录下有多个二级目录,所以用了ScrollerView嵌套ListView,可以推荐你用用ExpandableListView,这个控件可以完美解决你的问题,它自身就带有点击一级item折叠二级目录的功能。
头发还没秃a 2017-05-11
  • 打赏
  • 举报
回复
确定进入了 if (isShow){ ...... } 里面?
qq_16110639 2017-05-11
  • 打赏
  • 举报
回复
引用 6 楼 Demons_by 的回复:
引用 5 楼 Demons_by 的回复:
但是吧。。我知道你重写onMeasure是为了解决ScrollerView嵌套ListView时的滚动问题,但这种暴力方法实在是不太好。。你可以尝试下使用Android自带的NestScrollerView来彻底解决这个问题
不好意思。。是NestedScrollView
但是我在其他地方也是这样用的,没有问题,在这里不知道怎么了就不行了;我在listview外层还用了LinearLayout包裹,然后让LinearLayout隐藏也不行啊!
qq_16110639 2017-05-11
  • 打赏
  • 举报
回复
引用 8 楼 zhumj_zhumj 的回复:
确定进入了 if (isShow){ ...... } 里面?
我确认进入了,debug试了好多次了
Demons_by 2017-05-11
  • 打赏
  • 举报
回复
楼主别着急,我看你自定义listView里的onMeasure方法连续调用了两次super方法,感觉就是这块的原因。等今天晚上我回去帮你仔细看下,建议楼主先查查这块的逻辑~
Demons_by 2017-05-10
  • 打赏
  • 举报
回复
引用 5 楼 Demons_by 的回复:
但是吧。。我知道你重写onMeasure是为了解决ScrollerView嵌套ListView时的滚动问题,但这种暴力方法实在是不太好。。你可以尝试下使用Android自带的NestScrollerView来彻底解决这个问题
不好意思。。是NestedScrollView
Demons_by 2017-05-10
  • 打赏
  • 举报
回复
但是吧。。我知道你重写onMeasure是为了解决ScrollerView嵌套ListView时的滚动问题,但这种暴力方法实在是不太好。。你可以尝试下使用Android自带的NestScrollerView来彻底解决这个问题
Demons_by 2017-05-10
  • 打赏
  • 举报
回复
哦哦,看了你的自定义listview,我明白了。 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } } 当你执行setVisibily时,view层会去执行requestLayout()方法,这会导致onMeasure方法被系统调用,而你这个方法在重写的时候,把高度的mode设置成AT_MOST,这其实就是设置成wrapcontent,这就导致代码确实执行了,但在调用到onMeasure方法时,你把高度强制确定了,所以就出现gone不管用的问题了。
qq_16110639 2017-05-10
  • 打赏
  • 举报
回复
自定义的listview代码上面贴的有,我没有添加任何的动画效果,而且clearAnimation我也试过,没有任何反应。
Demons_by 2017-05-10
  • 打赏
  • 举报
回复
楼上的兄弟别激动。。这只是用到了第三方的包而已。。 对于楼主的问题,建议楼主看一下你在自定义的listView中,是否给listview设置了animation,我找到一篇可能对楼主有帮助的文章,http://www.cnblogs.com/albert1017/p/4724435.html
YXTS122 2017-05-10
  • 打赏
  • 举报
回复
你这是什么代码?   @BindView(R.id.main_back)这是啥?????我以前怎么都没见过??????

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧