无法更改ImageView的可见性

我有一个ListView使用自定义cursoradapter来填充ListView。

row.xml

 <?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:orientation="horizontal" > <LinearLayout android:orientation="vertical" android:layout_width="0dip" android:layout_weight="1" android:layout_height="fill_parent"> <TextView android:id="@+id/title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:singleLine="true" android:gravity="center_vertical" android:ellipsize="marquee" android:textSize="24dp" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/artist" android:singleLine="true" android:ellipsize="marquee" android:textSize="14dp" /> </LinearLayout> <ImageView android:id="@+id/currentplaying" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_marginLeft="1dip" android:src="@android:drawable/ic_media_play" android:contentDescription="@string/now_playing" android:visibility="gone" /> </LinearLayout> 

正如你所看到的,ImageView的可见性已经消失了。 我想让它可见一个特定的行。 这是我尝试的代码,但它不工作…

 View view = getListView().getAdapter().getView(0, null, null); ImageView iv = (ImageView)view.findViewById(R.id.currentplaying); iv.setVisibility(ImageView.VISIBLE); 

提前致谢。

 @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView==null) { holder = new ViewHolder(); convertView = inflater.inflate(R.layout.yourlayout, null); holder.imgViewLogo = (ImageView) convertView.findViewById(R.id.imgViewLogo); convertView.setTag(holder); } else { holder=(ViewHolder)convertView.getTag(); } if(position==0) { holder.imgViewLogo.setVisiblity(View.VISIBLE); } return convertView; } 

编辑:

我得到了它的工作。 我用这个来启动ListView活动。

 intent.putExtra("id", c.getInt(c.getColumnIndex(DatabaseHelper._ID))); startActivity(intent); 

在ListView活动中,

 currentplayingid = getIntent().getExtras().getInt("id"); 

然后我在bindview()

 ImageView imgview = (ImageView)view.findViewById(R.id.currentplaying); int id = c.getInt(c.getColumnIndex(DatabaseHelper._ID)); if (id == SongsListActivity.this.currentplayingid) imgview.setVisibility(View.VISIBLE); else imgview.setVisibility(View.GONE); 

Solutions Collecting From Web of "无法更改ImageView的可见性"

我得到了它的工作。 我用这个来启动列表视图活动。

 intent.putExtra("id", c.getInt(c.getColumnIndex(DatabaseHelper._ID))); startActivity(intent); 

在listview活动中,

 currentplayingid = getIntent().getExtras().getInt("id"); 

然后我join了这个bindview()

 ImageView imgview = (ImageView)view.findViewById(R.id.currentplaying); int id = c.getInt(c.getColumnIndex(DatabaseHelper._ID)); if ( id == SongsListActivity.this.currentplayingid ) imgview.setVisibility(View.VISIBLE); else imgview.setVisibility(View.GONE); 

也许你应该在你的适配器的getView()中做到这一点

编辑:

 @Override public View getView(int position, View convertView, ViewGroup parent) { // codes... if (position == 0) { holder.imgViewLogo.setVisibility(ImageView.VISIBLE); } else { holder.imgViewLogo.setVisibility(ImageView.GONE); } // codes... } 

你必须这样做

 iv.setVisibility(View.VISIBLE); 

如果是在工作一段时间,那么可能是我可以帮你。 每当你移动你的listview它会重新创build所有的视图,在这种情况下,它永远不会保存最后的状态。 所以你需要做的是保存你的每个imageview的状态,并在getView()你必须相应地设置。我张贴我的答案之一可能会帮助你。 这里有一些帮助你的代码:我将创build一个布尔数组列表。

private ArrayList imageview_visible = null;

然后,我将在我的构造函数中将所有imageview的状态设置为false:

 for (int i=0; i < no_of_elements.size(); i++) { imageview_visible.add(i, false); } 

在你的getView中写下这段代码:

公共查看getView(int位置,查看convertView,ViewGroup的父){//写你的代码

  if (imageview_visible.get(position) == true) { //SET YOUR IMAGE VIEW AS VISIBLE } else { // SET IMAGEVIEW AS GONE } 

}

每当你取消隐藏或隐藏你的视图,只需将其保存到imageview_visible.set(true或false),这将保存你所有的imageview的状态,并相应地设置每个图像视图

使用LayoutInflater来获取视图对象

 LayoutInflater inflater = this.getLayoutInflater(); View rowView = inflater.inflate(R.layout.row, null, true); ImageView iv = (ImageView)view.findViewById(R.id.currentplaying); iv.setVisibility(ImageView.VISIBLE); 

尝试以下代码,

  private class ViewHolder { ImageView imgViewLogo; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder holder; if(convertView==null) { holder = new ViewHolder(); convertView = inflater.inflate(R.layout.yourlayout, null); holder.imgViewLogo = (ImageView) convertView.findViewById(R.id.imgViewLogo); convertView.setTag(holder); } else { holder=(ViewHolder)convertView.getTag(); } if(position==0) { holder.imgViewLogo.setVisiblity(View.VISIBLE); } return convertView; } 

它适用于我…它可以帮助你。

我碰到类似的问题,其中几个小部件将出现一些行,但不为其他人。 问题是由于查看回收。 我不确定这是否是您的问题,但您仍然应该处理。 诀窍是为每一行设置可见性。 而不仅仅是你想要出现/消失的那一行。

所以:

 if (position == 0) { iv.setVisibility(ImageView.VISIBLE); } else { iv.setVisibility(ImageView.GONE); } 

否则,你认为除了0以外的位置的可见性是无效的,但可能不是视图回收的情况。 顺便说一句,我在bindView中做这个工作。 不知道这在技术上是否正确。

我有同样的问题…我解决了一个非标准的解决scheme,但为我工作…

 v.setImageResource(R.color.transparent); 

从android导入R

 import android.R; 

iv.setVisibility(View.VISIBLE);iv.setVisibility(ImageView.VISIBLE); 是正确的,但最好使用View而不是ImageView因为VISIBLEGONE是在View类中定义的。

如果你最改变两个可见性( VISIBLEGONE )。 喜欢:

 if(?) iv.setVisibility(View.VISIBLE); else iv.setVisibility(View.GONE); 

您可以使用setVisibility(int)隐藏或显示视图。 使用iv.setVisibility(View.VISIBLE);