2010-12-16 35 views
10

Creé un ListView con un diseño personalizado para cada vista. Tengo varios onClickListeners dentro del adaptador de vista de lista para TextView elementos dentro del diseño personalizado. Los onClickListeners funcionan dentro del adaptador de vista de lista y puedo obtener la posición de la vista, pero cuando trato de hacer llamadas dentro del onClickListeners a métodos en mi actividad, obtengo el mensaje "No puedo hacer una referencia estática a un método no estático". errores Así que comencé a convertir las cosas en estáticas, lo que hizo que todo funcionara como estaba previsto, pero estoy seguro de que todos ustedes saben que es un gran error, que finalmente me ha afectado.Android ListView Adapter OnClickListener problema

¿Cómo diablos puedo acceder a los métodos en mi actividad principal sin hacer que los métodos sean estáticos? Soy nuevo en esto, así que por favor perdona mi pregunta noobish. Gracias

parcial Listado de Código ...

public class main extends Activity { 
    private ArrayList<DataItem> dataItems; 
    private DataItemAdapter aa; 
    private ListView dataListView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     dataListView = (ListView)findViewById(R.id.dataListView);  
     dataItems = new ArrayList<DataItem>(); 
     int resID = R.layout.dataitem; 
     aa = new DataItemAdapter(this, resID, dataItems); 
     dataListView.setAdapter(aa); 
     dataListView.setItemsCanFocus(true); 

    populateArray(); 
} 

public void populateArray() { 
    DataItem newItem = new DataItem(
      "2008","Ferrari","F430","Red","ASX772" 
     ); 
    dataItems.add(0, newItem); 
    newItem = new DataItem(
      "2008","Ferrari","F430","Black","TZB123" 
     ); 
    dataItems.add(0, newItem); 
    newItem = new DataItem(
      "2009","Ferrari","F430","Red","MIDAS" 
     ); 
    dataItems.add(0, newItem);  

    aa.notifyDataSetChanged(); 
} 

public static void modelInfo(int pos) { 
    Log.i("modelInfo", "=" + pos); 
} 

public static void makeInfo(int pos) { 
    Log.i("makeInfo", "=" + pos); 
} 

public static void assetInfo(int pos) { 
    Log.i("assetInfo", "=" + pos); 
} 

} 


public class DataItemAdapter extends ArrayAdapter<DataItem> { 
    private Activity activity; 
    private int resource; 
    private static LayoutInflater inflater=null; 

    public DataItemAdapter(Activity _activity,int _resource,List<DataItem> _items) { 
     super(_activity, _resource, _items); 
     inflater = (LayoutInflater)_activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     resource = _resource; 
     activity = _activity; 
    } 

public static class ViewHolder { 
    TextView carYear; 
    TextView carMake; 
    TextView carModel; 
    TextView carColor; 
    TextView assetTag; 
    } 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View vi=convertView; 
    ViewHolder holder; 
    if (convertView == null) { 
     vi = inflater.inflate(resource, null); 
     holder=new ViewHolder(); 
     holder.carYear = (TextView)vi.findViewById(R.id.carYear); 
     holder.carMake = (TextView)vi.findViewById(R.id.carMake); 
     holder.carModel = (TextView)vi.findViewById(R.id.carModel); 
     holder.carColor = (TextView)vi.findViewById(R.id.carColor); 
     holder.assetTag = (TextView)vi.findViewById(R.id.assetTag); 
     vi.setTag(holder); 
    } else { 
     holder=(ViewHolder)vi.getTag(); 
    } 

    DataItem item = getItem(position); 

    holder.carYear.setText(item.getCarYear()); 
    holder.carMake.setText(item.getCarMake()); 
    holder.carModel.setText(item.getCarModel()); 
    holder.carColor.setText(item.getCarColor()); 
    holder.assetTag.setText(item.getAssetTag()); 

    holder.carYear.setTag(position); 
    holder.assetTag.setTag(position); 

    final OnClickListener makeListener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      LinearLayout ll = (LinearLayout)v.getParent(); 
      TextView tv = (TextView)ll.getChildAt(0); 
      Integer pos = (Integer) tv.getTag(); 
      main.makeInfo(pos); 
     } 
    }; 
    holder.carMake.setOnClickListener(makeListener); 

    final OnClickListener modelListener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      LinearLayout ll = (LinearLayout)v.getParent(); 
      TextView tv = (TextView)ll.getChildAt(0); 
      Integer pos = (Integer) tv.getTag(); 
      main.modelInfo(pos); 

     } 
    };   

    holder.carModel.setOnClickListener(modelListener); 

    final OnClickListener assetListener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      LinearLayout ll = (LinearLayout)v.getParent(); 
      TextView tv = (TextView)ll.getChildAt(0); 
      Integer pos = (Integer) tv.getTag(); 
      main.assetInfo(pos); 
     } 
    }; 
    holder.assetTag.setOnClickListener(assetListener);   

    return vi; 
} 

Respuesta

26

por qué usted no adjuntar una onItemClickListener a su ListView en su actividad, en lugar de realizar ItemClick desde cada punto de vista interno en el ListView

 dataListView = (ListView)findViewById(R.id.dataListView);  
     dataItems = new ArrayList<DataItem>(); 
     int resID = R.layout.dataitem; 
     aa = new DataItemAdapter(this, resID, dataItems); 
     dataListView.setAdapter(aa); 
     //attach a listener to the list view 
     dataListView.setOnItemClickListener (listener); 

     dataListView.setItemsCanFocus(true); 

y dentro de tu oyente en el método OnItemClick puedes acceder a los métodos de actividad.

EDIT 1: la OnItemClickListener da a usted los siguientes parámetros, los padres AdapterView, vista, posición int, long

su TextView individuo es un niño del parámetro de vista y se puede acceder a ella conseguir el childAt ... algo como esto:

OnItemClickListener listener = new OnItemClickListener(){ 

    @Override 
    onItemClick(AdapterView<?> parent, View view, int position, long id){ 
     ((TextView)view.findViewById(R.id.yourTextViewId)).getText(); 
     //or do your stuff 
    } 

} 

EDIT 2:

su actividad principal, recuerda, por convención, se capitalizan todos nombre de clase, clase de modo principal debe ser de clase principal

public class Main extends Activity { 
    private ArrayList<DataItem> dataItems; 
    private DataItemAdapter aa; 
    private ListView dataListView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     dataListView = (ListView)findViewById(R.id.dataListView);  
     dataItems = new ArrayList<DataItem>(); 
     int resID = R.layout.dataitem; 
     aa = new DataItemAdapter(this, resID, dataItems); 
     dataListView.setAdapter(aa); 
     dataListView.setItemsCanFocus(true); 

    populateArray(); 
} 

public void populateArray() { 
    DataItem newItem = new DataItem(
      "2008","Ferrari","F430","Red","ASX772" 
     ); 
    dataItems.add(0, newItem); 
    newItem = new DataItem(
      "2008","Ferrari","F430","Black","TZB123" 
     ); 
    dataItems.add(0, newItem); 
    newItem = new DataItem(
      "2009","Ferrari","F430","Red","MIDAS" 
     ); 
    dataItems.add(0, newItem);  

    aa.notifyDataSetChanged(); 
} 

public void modelInfo(int pos) { 
    Log.i("modelInfo", "=" + pos); 
} 

public void makeInfo(int pos) { 
    Log.i("makeInfo", "=" + pos); 
} 

public void assetInfo(int pos) { 
    Log.i("assetInfo", "=" + pos); 
} 
} 

Ahora, su adaptador

public class DataItemAdapter extends ArrayAdapter<DataItem> { 
    private Activity activity; 
    private int resource; 
    private LayoutInflater inflater=null; 

    public DataItemAdapter(Activity _activity,int _resource,List<DataItem> _items) { 
     super(_activity, _resource, _items); 
     inflater = (LayoutInflater)_activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     //i always do this way, but i dont think this is the error 
     //inflater = LayoutInflater.from(_activity.getBaseContext()); 
     resource = _resource; 
     activity = _activity; 
    } 

public static class ViewHolder { 
    TextView carYear; 
    TextView carMake; 
    TextView carModel; 
    TextView carColor; 
    TextView assetTag; 
    } 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View vi=convertView; 
    ViewHolder holder; 
    if (convertView == null) { 
     vi = inflater.inflate(resource, null); 
     holder=new ViewHolder(); 
     holder.carYear = (TextView)vi.findViewById(R.id.carYear); 
     holder.carMake = (TextView)vi.findViewById(R.id.carMake); 
     holder.carModel = (TextView)vi.findViewById(R.id.carModel); 
     holder.carColor = (TextView)vi.findViewById(R.id.carColor); 
     holder.assetTag = (TextView)vi.findViewById(R.id.assetTag); 
     vi.setTag(holder); 
    } else { 
     holder=(ViewHolder)vi.getTag(); 
    } 

    DataItem item = getItem(position); 

    holder.carYear.setText(item.getCarYear()); 
    holder.carMake.setText(item.getCarMake()); 
    holder.carModel.setText(item.getCarModel()); 
    holder.carColor.setText(item.getCarColor()); 
    holder.assetTag.setText(item.getAssetTag()); 

    holder.carYear.setTag(position); 
    holder.assetTag.setTag(position); 

    final OnClickListener makeListener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      LinearLayout ll = (LinearLayout)v.getParent(); 
      TextView tv = (TextView)ll.getChildAt(0); 
      Integer pos = (Integer) tv.getTag(); 
      //main.makeInfo(pos); 
      ((Main)activity).makeInfo(pos); 
     } 
    }; 
    holder.carMake.setOnClickListener(makeListener); 

    final OnClickListener modelListener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      LinearLayout ll = (LinearLayout)v.getParent(); 
      TextView tv = (TextView)ll.getChildAt(0); 
      Integer pos = (Integer) tv.getTag(); 
      //main.modelInfo(pos); 
      ((Main)activity).modelInfo(pos); 
     } 
    };   

    holder.carModel.setOnClickListener(modelListener); 

    final OnClickListener assetListener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      LinearLayout ll = (LinearLayout)v.getParent(); 
      TextView tv = (TextView)ll.getChildAt(0); 
      Integer pos = (Integer) tv.getTag(); 
      //main.assetInfo(pos); 
      ((Main)activity).assetInfo(pos); 
     } 
    }; 
    holder.assetTag.setOnClickListener(assetListener);   

    return vi; 
} 

esperemos que funcione :)

+0

Gracias por responder. ¿OnItemClickListener permite indicar en qué elementos de TextView se hizo clic dentro del diseño personalizado VICE simplemente haciendo referencia a la vista individual (posición) en la que se hizo clic? ¿Cómo? Esa es probablemente la información que me falta. – ReinD

+0

@ user544751, vea mi publicación editada – Franco

+0

Gracias de nuevo. Entiendo su ejemplo, pero no necesito el valor de lo que se hizo clic, necesito saber en qué clic de texto se hizo clic. es decir, TextView1, TextView2, TextView3, TextView4. He estado jugando con eso, pero no sé cómo hacer coincidir el R.id.myTextViewId con lo que se hizo clic. – ReinD

Cuestiones relacionadas