无法更改ImageView的可见性

时间:2012-04-23 03:17:09

标签: android android-imageview

我有一个使用自定义cursoradapter的ListView来填充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);

10 个答案:

答案 0 :(得分:2)

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

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);

答案 1 :(得分:1)

也许您应该在适配器的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...
}

答案 2 :(得分:0)

你必须这样做

iv.setVisibility(View.VISIBLE);

答案 3 :(得分:0)

请尝试以下代码,

     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;
} 

它对我有用......它可能对你有帮助。

答案 4 :(得分:0)

我遇到了类似的问题,其中一些小部件会出现在某些行中而不会出现在其他行中。问题是由于视图回收。我不确定这是否是你的问题,但无论如何你应该处理它。诀窍是为每一行设置可见性;而不仅仅是你想要出现/消失的行。

所以:

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

否则,您假设对于0以外的位置,可见性为GONE,但视图回收可能不是这种情况。顺便说一句,我在bindView中做这个工作。不确定这在技术上是否正确。

答案 5 :(得分:0)

如果它正在工作一段时间,那么我可以帮助你。无论何时移动listview,它都会再次重新创建所有视图,在这种情况下它永远不会保存最后的视图状态。所以你需要做的是保存你的每个imageview的状态,并在getView()中你必须相应地设置。我发布了一个答案,它可能会帮助你。 这是一个小代码供您使用:我将创建一个布尔arraylist。

private ArrayList imageview_visible = null;

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

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

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

public View getView(int position,View convertView,ViewGroup parent) {      //写你的代码

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

}

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

答案 6 :(得分:0)

使用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);

答案 7 :(得分:0)

我有同样的问题......我用非标准解决方案解决了,但为我工作......

v.setImageResource(R.color.transparent);

从android

导入R.
import android.R;

答案 8 :(得分:0)

iv.setVisibility(View.VISIBLE);iv.setVisibility(ImageView.VISIBLE);都是正确的,但最好使用View代替ImageView,因为VISIBLE&amp; GONEView类中定义。

您最常更改VISIBLE中的可见性(GONEif)。像:

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

答案 9 :(得分:0)

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