Dipesh
Dipesh

Reputation: 223

Cannot change the visiblity of an ImageView

I have a ListView using a custom cursoradapter to fill the ListView.

The 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>

As you can see, the ImageView's visibility is gone. I want to make it visible for one particular row. Here is the code I tried but it is not working...

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

Thanks in advance.

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

EDIT:

I got it working. I used this to start the ListView activity.

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

In the ListView activity,

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

Then I added this in 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);

Upvotes: 8

Views: 6098

Answers (10)

LomE999
LomE999

Reputation: 119

You can hide or show views using setVisibility(int) . use iv.setVisibility(View.VISIBLE);

Upvotes: 0

Hossain Khademian
Hossain Khademian

Reputation: 1706

Both iv.setVisibility(View.VISIBLE); and iv.setVisibility(ImageView.VISIBLE); are correcte but It's better to use View instead of ImageView because VISIBLE & GONE are defined in View class.

You most change Both Visibility (VISIBLE or GONE) in that if. like:

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

Upvotes: 0

Angel Ivorra
Angel Ivorra

Reputation: 211

I have the same issue... i solved with a non standar solution, but worked for me...

v.setImageResource(R.color.transparent);

importing R from android

import android.R;

Upvotes: 0

Joel Skrepnek
Joel Skrepnek

Reputation: 1661

I ran into similar problems where several widgets would appear for some rows but not for others. The problems were due to view recycling. I'm not exactly sure if that's your issue here, but you should handle it anyway. The trick is to set visibility for every row; instead of just for the row that you want to appear/disappear.

So:

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

Otherwise, you're assuming that for positions other than 0 the visibility is GONE but that might not be the case with view recycling. I do this work in bindView, by the way. Not sure if that's technically correct.

Upvotes: 0

Dipesh
Dipesh

Reputation: 223

I got it working. I used this to start the list view activity.

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

In the listview activity,

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

Then i added this in 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);

Upvotes: 2

C. Leung
C. Leung

Reputation: 6318

perhaps you should do it in getView() of your adapter

EDIT:

@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...
}

Upvotes: 1

deepa
deepa

Reputation: 2494

Try the following code as follows,

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

It Works for me...It may help you.

Upvotes: 0

ankita gahoi
ankita gahoi

Reputation: 1562

Use LayoutInflater to get view object

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

Upvotes: 0

Bharat Sharma
Bharat Sharma

Reputation: 3966

If it is working some time then may be i can help you. What happen that whenever you move you listview it recreates all views again in this case it never save the last state of view. So what you need to do is to save state of your each imageview and in getView() you have to set accordingly.I am posting one of my answer it may help you. Here is a little code for your help: I will create a boolean arraylist.

private ArrayList imageview_visible = null;

Then I will set states of all imageview as false in my constructor:

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

In your getView write this code:

public View getView (int position, View convertView, ViewGroup parent) { //WRITE YOUR CODE

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

}

Whenever you unhide or hide your view just save it into imageview_visible.set(true or false) this will save state of you all imageview and set every image view accordingly

Upvotes: 0

Yayo28
Yayo28

Reputation: 342

You have to do it like this

iv.setVisibility(View.VISIBLE);

Upvotes: 0

Related Questions