Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Edición de OnClickListener del adaptador ListView de Android

He creado un ListView con un diseño personalizado para cada vista. Tengo varios onClickListeners dentro del adaptador de vista de lista para los elementos de TextView 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 intento hacer llamadas dentro de los onClickListeners a los métodos en mi actividad, obtengo el "No puedo hacer una referencia estática a un método no estático" Errores. Así que empecé a convertir las cosas en estática, lo que hizo que las cosas funcionaran como estaba previsto, pero estoy seguro de que todos ustedes saben que es un gran error, lo que finalmente ha alcanzado a mí.

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

Código parcial …

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

  • Establecer el color del icono FAB
  • Android limitar el tiempo de grabación con la intención
  • ImageView onImageChangedListener Android
  • Java.io.IOException: com.android.jack.api.v01.CompilationException: Error al compilar
  • Cómo configurar dagger + gradle
  • ¿Cómo puedo findViewByTag?
  • Cómo conseguir la trayectoria de la imagen apenas capturada de la cámara
  • Icono de notificación al descargar el archivo
  • One Solution collect form web for “Edición de OnClickListener del adaptador ListView de Android”

    Por qué no adjuntar un onItemClickListener a su ListView en su actividad, en lugar de realizar ItemClick desde cada vista interna 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: el OnItemClickListener le da los siguientes parámetros, padre de AdapterView, vista de vista, posición int, largo

    Su TextView individual es un elemento secundario del parámetro view y puede acceder a él consiguiendo 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, recuerde, por convención todos los nombres de la clase están en mayúsculas, por lo que la clase principal debe ser la 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; } 

    espero que funcione 🙂

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.