2011-10-15 16 views
18

Quindi in pratica ho bisogno di un piccolo aiuto o di alcuni suggerimenti con il problema che ho. Sto compilando la mia vista elenco dal database e devo controllare quando creo la mia listview se l'ID dell'articolo su position è uguale all'ID di un'altra tabella nel mio database. Se lo è, puoi fare clic su quell'elemento, se non voglio che lo disabiliti, ma tutte le informazioni che ho trovato su come farlo ... non riesco davvero a capire come farlo.Android disabilita listview elementi

import java.util.ArrayList; 


import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

//For more information look at the bottom of file. 

public class LazyAdapter extends BaseAdapter { 


    private Activity activity; 
    private String[] data; 
    private ArrayList<String> name; 
    private ArrayList<String> info; 
    private static LayoutInflater inflater=null; 
    public ImageLoader imageLoader; 
    private Bitmap b; 

    public LazyAdapter(Activity a, Bitmap d, ArrayList<String> names, ArrayList<String> information) { 
     activity = a; 
     b=d; 
     name=names; 
     info = information; 
     inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     imageLoader=new ImageLoader(activity.getApplicationContext()); 
    } 

    public int getCount() { 
     return name.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public static class ViewHolder{ 
     public TextView name,info; 
     public ImageView image; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi=convertView; 
     ViewHolder holder; 
     if(convertView==null){ 
      vi = inflater.inflate(R.layout.item, null); 
      holder=new ViewHolder(); 
      holder.name=(TextView)vi.findViewById(R.id.name); 
      holder.info=(TextView)vi.findViewById(R.id.info); 
      holder.image=(ImageView)vi.findViewById(R.id.image); 
      vi.setTag(holder); 
      Log.v("Position","Position : "+position); 
     } 
     else 
      holder=(ViewHolder)vi.getTag(); 
      holder.name.setText(name.get(position)); 
      holder.info.setText(info.get(info.size()-1)); 

      //Here I must do a black magic and get the images if user had 'em. 

      holder.image.setImageBitmap(b); 

      //holder.image.setTag(data[position]); 
      //imageLoader.DisplayImage(data[position], activity, holder.image); 

      // Black magic over. 
     return vi; 
    } 
} 

Qualche idea o suggerimento su come farlo?

+0

Cosa stai usando attualmente? Hai definito l'adattatore personalizzato per il listview? –

+0

sì, in realtà sto usando un adattatore personalizzato. lasciatemi inserire il codice –

+0

in questo modo, nel metodo getview, inserisci una condizione if e ottieni l'id dell'oggetto, contemporaneamente credo che tu abbia un'altra raccolta in cui hai la lista di id contro cui controllare, oppure crea un seleziona la query con l'id, se il conteggio è 1 che significa presente, altrimenti no, se presente, imposta il metodo setEnabled della vista su true else false. (fai questo sul click dell'articolo della lista) –

risposta

0

Non sai cosa stai facendo lì, ma quello che vuoi fare è definire la tua classe come faresti normalmente estendendo Activity (o ListActivity). Quindi, trasformando la classe dell'adattatore in una classe nidificata all'interno della classe Attività estendendo BaseAdapter.

Una volta fatto, scriveremo il metodo getView() nella classe dell'adattatore. Assegna l'OnClickListener alla vista in base alle condizioni che hai menzionato.

68

Nell'adattatore è presente un nome di metodo isEnabled che è possibile modificare. Questo è chiamato per ogni riga come getview. Onclicklistener verrà attivato solo se questa funzione restituisce true. Quindi prova a farlo nell'adattatore di custodia.

@Override 
public boolean isEnabled(int position) { 
    if(YOUR CONDTITION){ 
     return false; 
    } 
    return true; 
} 
+6

O, più semplicemente: 'return! (YOUR_CONDITION);', dove puoi usare le operazioni inverse ('! =' vs '==' per semplificare ulteriormente). – reece

+3

Bella risposta. Mi chiedo perché questo non è stato accettato? – Abx

+0

Questo è esattamente quello che stavo cercando! Sono sorpreso che nessuno dei tutorial che ho letto ne abbia parlato. – Aelexe

2

Quando si passa un elenco di oggetti da BaseAdpater, aggiungere un campo in oggetto di questa lista denominata isEnabled e impostarla vero/falso, se necessario, quindi sovrascrivere il metodo isEnabled di BaseAdapter come questo

@Override 
public boolean isEnabled(int position) { 

    return info.get(position).isEnabled; 
} 

dove informazioni è la vostra lista di oggetti

2

per esempio, se si desidera disabilitato le posizioni da 0 a 5

@Override 
public boolean isEnabled(int position){ 
    if(position >= 0 && position < 6) 
     return false; 
    else 
     return true; 
} 

@Override 
public boolean areAllItemsEnabled(){ 
    return true; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

      //CODE OF ADAPTER 
} 
-1

Nell'adattatore, aggiungere questo.

if ((position)!="your item"){ 
    view.setEnabled(true); 
    view.setClickable(true); 
} else{ 
    view.setEnabled(false); 
    view.setClickable(false); 
} 

`

Problemi correlati