2012-04-23 3 views
8

Ho un controllo ListView utilizzando un cursore personalizzato per riempire il ListView.Impossibile modificare la visibilità di un ImageView

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

Come si può vedere, la visibilità del ImageView è andato. Voglio renderlo visibile per una particolare riga. Ecco il codice che ho provato, ma non è lavoro ...

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

Grazie in anticipo.

@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:

ho capito di lavoro. L'ho usato per avviare l'attività ListView.

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

Nell'attività ListView,

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

poi ho aggiunto questo 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); 
+0

iv.setVisibility (View.VISIBLE); o iv.setVisibility (1); non funziona? –

+0

Prova a utilizzare View.INVISIBLE invece di View.GONE se è adatto alle tue esigenze. E prova a farlo nel codice piuttosto che nel file xml. –

risposta

1

forse si dovrebbe fare in getView() della scheda

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... 
} 
+0

Il problema che ottengo durante l'utilizzo in getView() è ogni volta che si scorre, la vista di ogni riga della 0a riga diventa visibile sullo schermo. – Dipesh

+0

cosa intendi per "ogni 0 ° riga"? – candyleung

+0

Puoi darmi un esempio su cui lavorare? – Dipesh

0

quello che dovete fare in questo modo

iv.setVisibility(View.VISIBLE); 
+0

Utilizzo di View.VISIBLE invece di ImageView.VISIBLE non funziona. – Dipesh

+0

Cosa per il pulsante immagine? – LomE999

0

Provate il seguente codice come segue,

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

funziona per me ... Essa può aiutare.

+0

Non voglio che accada quando si fa clic su un listino. Voglio rendere visibile l'immagine per una riga quando viene visualizzato listview. – Dipesh

+0

scusa ho capito male il tuo requisito. controlla la risposta aggiornata. – deepa

+0

Ho due visualizzazioni di testo nella mia riga. Controlla il mio row.xml qui sopra. Non visualizzano più alcun testo. E quando faccio scorrere verso il basso l'elenco, la vista di immagini è visibile per alcune altre righe che immagino sia a causa del riciclaggio della vista menzionato da Joel Skrepnek in una precedente risposta. – Dipesh

0

Ho riscontrato problemi analoghi in cui diversi widget apparivano per alcune righe ma non per altri. I problemi erano dovuti alla visione del riciclaggio. Non sono proprio sicuro se questo è il tuo problema qui, ma dovresti gestirlo comunque. Il trucco è impostare la visibilità per ogni riga; invece di solo per la riga che vuoi apparire/scomparire.

Quindi:

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

In caso contrario, si sta assumendo che per posizioni diverse da 0 la visibilità è andato, ma che potrebbe non essere il caso con la vista del riciclaggio. A proposito, lavoro in BindView. Non sono sicuro che sia tecnicamente corretto.

+0

Come trovo la posizione in bindView()? L'oggetto vista – Dipesh

0

Se funziona un po 'di tempo, allora potrei essere in grado di aiutarti. Cosa succede che ogni volta che ti muovi listview ricrea di nuovo tutte le viste in questo caso non salva mai l'ultimo stato di vista. Quindi, ciò che devi fare è salvare lo stato di ogni visualizzazione di immagini e in getView() che devi impostare di conseguenza. Sto pubblicando una delle mie risposte che potrebbe aiutarti. Ecco un piccolo codice per il tuo aiuto: creerò un arraylist booleano.

private ArrayList imageview_visible = null;

Poi mi metterò stati di tutti imageview come falsi nel mio costruttore:

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

Nella tua GetView scrivere questo codice:

pubblica Vista GetView (int position, Vista convertView, ViewGroup genitore) {// scrivere il codice

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

}

Ogni volta che si unhide o nascondere la visualizzazione solo salvare in imageview_visible.set (vero o falso) questo farà risparmiare stato di tutti voi ImageView e impostare ogni vista immagine di conseguenza

0

Usa LayoutInflater per ottenere la vista oggetto

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

non è definito. – zygimantus

2

Ho funzionato. L'ho usato per avviare l'attività di visualizzazione elenco.

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

Nell'attività listview,

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

poi ho aggiunto questo 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); 
+0

Puoi contrassegnare questa domanda come risposta ... :-) – Greenonline

0

ho lo stesso problema ... ho risolto con una soluzione non standar, ma ha funzionato per me ...

v.setImageResource(R.color.transparent); 

im porting R da androide

import android.R; 
0

Sia iv.setVisibility(View.VISIBLE); e iv.setVisibility(ImageView.VISIBLE); sono correcte ma è meglio usare View anziché ImageView perché VISIBLE & GONE sono definite View classe.

La maggior parte cambia sia Visibilità (VISIBLE o GONE) in quello if. come:

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

È possibile nascondere o visualizzare una vista utilizzando setVisibility (int). uso iv.setVisibility(View.VISIBLE);