2 yinxiaopei yinxiaopei 于 2015.06.05 16:40 提问

android viewpager根据数组的长度动态加载布局,隐藏控件无效。

布局文件

android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_marginBottom="@dimen/margin_medium"
    android:layout_weight="10" >
</android.support.v4.view.ViewPager>

<LinearLayout
    android:id="@+id/viewGroup"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:gravity="center"
    android:orientation="horizontal" >
</LinearLayout>

private void initViewPager() {
View view = null;
for (i = 0; i < videoNum//数量是根据从服务器取下的数据,长度是可变的
; i++) {
view = getActivity().getLayoutInflater().inflate(
R.layout.fragment_one_video, null);
viewList.add(view);
mRtspVideoView = (RtspVideoView) view.findViewById(R.id.rv_view);
mRtspVideoView.setPlaySize(Constants.SCREEN_WIDTH,
Constants.SCREEN_HEIGHT);
mIvLogo = (ImageView) view.findViewById(R.id.iv_logo);

在OnPageChangeListener里,操作了一个播放视频。我有一个线程在播放成功的时候,把未播放视频时候的mIvLogo隐藏。
private Handler videoHandler = new Handler() {

    @Override
    public void handleMessage(Message msg) {
        System.out.println("real video");
        mIvLogo.clearAnimation();//隐藏无效。如果是显示也是无效
        mIvLogo.setVisibility(View.GONE);
    }
};
不知道是什么原因,一直是无效的。我在滑动页面的其他操作是有效的。比如按页面的position获取数据是有效的。

5个回答

danielinbiti
danielinbiti   Ds   Rxr 2015.06.05 16:44
已采纳
mIvLogo = (ImageView) view.findViewById(R.id.iv_logo);这是在循环里,最后记录的是最后一次for循环的组件。
 private Handler videoHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        System.out.println("real video");
        mIvLogo.clearAnimation();//隐藏无效。如果是显示也是无效
        mIvLogo.setVisibility(View.GONE);//你点击的时候这个mIvLogo是最后一次view中的iv_logo
    }
};
danielinbiti
danielinbiti 回复yinxiaopei: 得看你线程怎么播放的,在handleMessage需要能够获取到viewpage,你不是有viewList嘛,也可以传viewpage所在的位置,再获取viewpage,然后根据mIvLogo = (ImageView) view.findViewById(R.id.iv_logo);获取mIvlogo,再隐藏
2 年多之前 回复
yinxiaopei
yinxiaopei 嗯-- 然后我要怎么写才可以隐藏当前的这个啊
2 年多之前 回复
danielinbiti
danielinbiti 回复yinxiaopei: 哦,就是上次哪个隐藏显示的呀,我不提示你了嘛
2 年多之前 回复
yinxiaopei
yinxiaopei 好像是这样 感觉要被自己蠢哭了 t.t 刚刚那个问题也是我问的 没错就是我!!
2 年多之前 回复
qq_16366665
qq_16366665   2015.06.05 17:06

mIvLogo = (ImageView) view.findViewById(R.id.iv_logo);在循环里只会赋值最后一个值

yinxiaopei
yinxiaopei 谢谢回答 问题以解决
2 年多之前 回复
qq_16366665
qq_16366665   2015.06.05 17:12

你可以将那些需要显示隐藏的组件放集合里 根据Viewpager改变的position取出来对应的组件让其显示 其他的隐藏 不知道可不可以

yinxiaopei
yinxiaopei   2015.06.08 10:09

谢谢各位的帮助 该问题已经解决 解决方法是
mIvLogo = (ImageView) view.findViewById(R.id.iv_logo);
mIvLogo.setTag(i + "page");
在循环中给该控件设置tag,然后在OnPageChangeListener下的方法
@Override
public void onPageSelected(int page) {
mIvLogo = (ImageView) mVPager.findViewWithTag(page + "page");//找到当前控件

然后就可以隐藏该控件。

datou431
datou431   Rxr 2015.06.10 15:27

(ImageView) view.findViewById(R.id.iv_logo);在循环里只会赋值最后一个值

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!