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;
}
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
@ user544751, vea mi publicación editada – Franco
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