android 中 imageview 设置可见性的问题

2015-08-25 17:38:51 +08:00
 creatorYC

我用 SimpleAdapter 作为 ListView 的适配器,自定义了一个布局,里面有一个 ImageView 和一个 TextView ,我想要实现 ListView 的每一项都是文字加图片的效果。布局文件如下: <ImageView
android:id="@+id/ItemImage"
android:layout_alignParentRight="true"
android:layout_marginRight="20sp"
android:layout_width="30sp"
android:layout_height="30sp"
android:visibility="gone"
/>

<TextView
    android:id="@+id/ItemText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20sp"
    android:textSize="20sp" />
 我设置了 android:visibility="gone",是想开始的时候让图片不显示,在需要显示的地方再显示。然后我点击某个按钮后,想让此图片显示。所以我先遍历 ListView ,然后得到这个 ImageView 对象,再设置它的可见性,代码如下( set 是一个按钮):
 set.setOnClickListener (new OnClickListener () {
        @Override
        public void onClick (View v ) {
             //全选遍历 ListView 的选项,每个选项就相当于布局配置文件中的 RelativeLayout  
             for (int i = 0; i < cityListView.getCount (); i++){  
                 RelativeLayout layout = 
                         (RelativeLayout ) cityListView.getAdapter ().getView (i, null, null );  
                 ImageView image = (ImageView ) layout.getChildAt (0 );
                 image.setImageResource (R.drawable.delete );
                 image.setVisibility (View.VISIBLE );

             }
        }
    });
    可是都设置完成后,先前隐藏的图片还是都没显示,不知道什么愿因,
    ps :我的目的是让 ListView 里面被隐藏的图片显示出来,不知道是不是应该这样做
9837 次点击
所在节点    Android
36 条回复
creatorYC
2015-08-25 22:16:17 +08:00
@ssynhtn 那我就更困惑了,暂且不说代码优化,用这种拙劣的不优化的代码能不能实现我想要的效果呢?
xhuuanniqege
2015-08-25 22:19:41 +08:00
@creatorYC 新手用这个方法也说明挺动脑筋的了,多写多练,多谷歌,能力很快会提高的
gengrui
2015-08-25 22:26:10 +08:00
@creatorYC 不客气 :)
ssynhtn
2015-08-25 22:27:28 +08:00
我知道问题了,原因是你主动调用了 getView ,下面是 SimpleAdapter 的 getView 方法,因为传入的 convertView 是 null ,所以会新建一个 view ,这个 view 不会被 ListView 使用,因为只有 ListView 调用 getView 返回的那个 view 会被 ListView 使用,所以你对这个 view 进行任何操作都是没有任何用的

/**
* @see android.widget.Adapter#getView (int, View, ViewGroup )
*/
public View getView (int position, View convertView, ViewGroup parent ) {
return createViewFromResource (position, convertView, parent, mResource );
}

private View createViewFromResource (int position, View convertView,
ViewGroup parent, int resource ) {
View v;
if (convertView == null ) {
v = mInflater.inflate (resource, parent, false );
} else {
v = convertView;
}

bindView (position, v );

return v;
}
ssynhtn
2015-08-25 22:28:15 +08:00
我之前说 textview 覆盖 imageview 的那个解释是错误的,以为 textview 的 background 默认是透明的
creatorYC
2015-08-25 22:36:50 +08:00
@ssynhtn 好像挺深奥的。。。恕我愚昧,我想知道我应该怎么写呢。。
creatorYC
2015-08-25 22:48:50 +08:00
@Bown 按您的方法,我实现了想要的效果,您能帮忙讲一下这两个的区别吗,就是因为像 @ssynhtn 说的那样,主动调用 getView 方法导致重新创建了一个 view ?
ssynhtn
2015-08-25 22:51:34 +08:00
@creatorYC 继承 BaseAdapter 或者 ArrayAdapter ,建一个 model 类{text, image, visible}作为一行, Adapter 中保持一个 List<Model>,当需要对某一行的图片进行隐藏的时候对那一行的 model 的 visible 设为 false ,接着调用 Adapter.notifyDatasetChanged
如果听不懂的话,善用 Google ,而且我真的很推荐 udacity 的免费 Android 课程
creatorYC
2015-08-25 22:55:20 +08:00
@ssynhtn 谢谢您,我会认真看的,多谢
kaient
2015-08-26 11:53:48 +08:00
我觉得吧,如果你把 imageView 的的 GONE 变成 INVISIBLE 应该就对了
creatorYC
2015-08-26 13:31:40 +08:00
@xhuuanniqege 请问你们都是怎么谷歌的,翻墙了还是用什么 vpn 啊
xhuuanniqege
2015-08-26 18:41:35 +08:00
@creatorYC 翻墙了
wzg1015
2015-08-27 11:41:32 +08:00
1.看见你的宽度啥都用 sp 就蛋疼
2.贴代码就贴全, ImageView 的父布局都不贴,你怎么知道一定是这个 imageView 的问题? 或许就是你 item 的布局就错误了呢,导致 imageView 无处显示呢
3.上面是布局,下面是代码,一个字乱,何况代码就光一个监听,你就知道其他地方都正确?或许我们累死累活的找 bug ,结果发现就因为你这句语句没调用呢
4.ImageView image = (ImageView ) layout.getChildAt (0 ); 很少见到这种写法,哪天你把图片放后面了,然后就报错了
5.RelativeLayout layout =(RelativeLayout ) cityListView.getAdapter ().getView (i, null, null ); 如同 @ssynhtn 所说,你这根本就是创建了一个新的 view ,你显示它的图片,并没有卵用。

6.如果让我写这个,我会将需要显示的数据放在一个 List 集合中,其元素就是每一行需要显示的图片( id ),文字,其中有个属性为是否显示图片,默认为不显示。 将 List 集合传给 adapter 。当点击按钮的时候,修改 list 内部数据,调用 adapter 的 notifyOnDataChange 。 这样逻辑在 activiy 里实现,显示在 adpter 实现。
creatorYC
2015-08-27 12:34:37 +08:00
@wzg1015 我按 @Bown 说的那样,已经解决了,正如您说的那样,我用这个 RelativeLayout layout =(RelativeLayout ) cityListView.getAdapter ().getView (i, null, null ); 其实就是创建了一个新的 view ,我贴这些代码是因为我敢肯定是这里面的问题,因为我的功能都是一个个加的,都是一个个测试的,关于代码的质量,我的确需要提高很多,因为我才刚学不久,所以现在要求自己先把功能做出来,代码优化的确做的很差。不管怎样,都谢谢您的耐心解答,我会提高自己问问题的水平,抱歉
quiz
2015-08-28 12:43:47 +08:00
Golang 效率高了,但是应该算是一种退步吧:)
https://www.dartlang.org/mobile/
看看 google 想怎么玩儿
quiz
2015-08-28 12:44:36 +08:00
cha ,回错贴了~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/215907

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX