2011-10-15 26 views
18

SO Básicamente, necesito un poco de ayuda o algunas sugerencias con el problema que tengo. Estoy rellenando mi vista de lista desde la base de datos y necesito verificar cuándo estoy creando mi lista de lista si la identificación del artículo en position es la misma que la identificación de otra tabla en mi base de datos. Si es así, puede hacer clic en ese elemento; si no, quiero que lo desactive, pero toda la información que encontré sobre cómo hacerlo ... realmente no puedo entender cómo hacerlo.Android deshabilitar elementos listview

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

¿Alguna idea o sugerencia de cómo hacer eso?

+0

¿Qué estás usando actualmente? ¿Ha definido el adaptador personalizado para la vista de lista? –

+0

Sí, en realidad estoy usando un adaptador personalizado. déjame poner el código –

+0

puedes hacer esto, en el método getview, poner en una condición if y obtener el id del ítem, al mismo tiempo creo que tienes otra colección donde tienes la lista de identificadores contra los cuales verificar, o si no haces una seleccione la consulta con el ID, si el recuento es 1 que significa su presente, de lo contrario, si está presente, establezca el método setEnabled de la vista en true else false. (haz esto al hacer clic en el elemento de la vista de lista) –

Respuesta

0

No estoy seguro de lo que estás haciendo allí, pero lo que quieres hacer es definir tu clase como lo harías normalmente extendiendo Activity (o ListActivity). Luego, haga que su clase de adaptador sea una clase anidada dentro de la clase Activity al extender BaseAdapter.

Una vez que haya hecho eso, escribirá su método getView() dentro de su clase de adaptador. Asigne OnClickListener a la vista allí según la condición que ha mencionado.

68

En el adaptador hay un nombre de método isEnabled que puede reemplazar. Esto se llama para cada fila como getview. Onclicklistener solo se activará si esta función devuelve verdadero. Intenta hacerlo en tu adaptador personalizado.

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

O, más simplemente: 'return! (YOUR_CONDITION);', donde puedes usar las operaciones inversas ('! =' vs '==' para simplificar aún más). – reece

+3

Buena respuesta. Me pregunto por qué esto no fue aceptado. – Abx

+0

¡Esto es exactamente lo que estaba buscando! Me sorprende que ninguno de los tutoriales que leí lo haya mencionado. – Aelexe

2

Cuando se pasa una lista de objetos a BaseAdpater, agregar un campo en el objeto de esta lista se llama isEnabled y ponerlo a verdadero/falso, según sea necesario, a continuación, reemplazar el método isEnabled de BaseAdapter como esto

@Override 
public boolean isEnabled(int position) { 

    return info.get(position).isEnabled; 
} 

donde información es su lista de objetos

2

Por ejemplo si quieres desactivado las posiciones 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

En su adaptador, agregue esto.

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

`

Cuestiones relacionadas