cómo usar un ArrayAdapter en Android de objetos personalizados

¿Cómo puedo usar las propiedades de un objeto personalizado en una vista de lista? Si implemento un ArrayAdapter con una lista de cadenas, se muestra bien en Listview, pero cuando uso una lista de objetos personalizados, solo muestra la dirección de la memoria.

El código que tengo hasta ahora:

ArrayList allObjects = new ArrayList(); allObjects.add("title", "http://url.com")); ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, android.R.id.text1, allNews); // Assign adapter to ListView listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { Uri uri = Uri.parse( "http://www.google.com" ); startActivity(new Intent(Intent.ACTION_VIEW, uri)); } }); 

Hay una pregunta similar aquí, pero eso no es lo que necesito, ya que solo necesito que el título se muestre en la vista de lista y cuando hacen clic en extraer la url.

Un ArrayAdapter muestra el valor devuelto por el método toString() , por lo que deberá anular este método en su clase de objeto personalizada para devolver el String deseado. También necesitará tener al menos un método getter para la URL, para que pueda recuperar eso en el evento click.

 public class NewsObject { private String title; private String url; public NewsObject(String title, String url) { this.title = title; this.url = url; } public String getUrl() { return url; } @Override public String toString() { return title; } ... } 

En el método onItemClick() , position será el índice en ArrayList de sus objetos personalizados correspondientes al elemento de la lista en el que se onItemClick() clic. Recupere la URL, startActivity() y llame a startActivity() .

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { NewsObject item = allNews.get(position); String url = item.getUrl(); Uri uri = Uri.parse(url); startActivity(new Intent(Intent.ACTION_VIEW, uri)); } }); 

Tenga en cuenta que asumí que su clase personalizada es NewsObject , ya que es lo que se utiliza con su ejemplo de adaptador.

Si desea utilizar un método de su clase personalizada, debe implementar una clase custor ArrayAdapter … ¿Cómo crear esto?

Primer paso

Obtenga su proyecto y cree una nueva clase. Luego amplía la clase con ArrayAdapter{} y declara dentro de sus atributos lo que necesita … Mi ejemplo:

 public class Room_Adapter extends ArrayAdapter { //Declaration of Atributes private ArrayList Rooms_Array; private final Activity context; private final ListView lvBuinding; 

Segundo

Declara un constructor para esta clase, siempre necesitas una Activity y ArrayList, pon las otras si lo necesitas … En mi caso necesito la lista de mi … Mi ejemplo:

 public Room_Adapter(Activity context, ArrayList Rooms_Array,ListView lvBuinding) { super(context, R.layout.room_layout, Rooms_Array); this.context = context; this.Rooms_Array = Rooms_Array; this.lvBuinding = lvBuinding; } 

El supermétodo necesita tu actividad, diseño personalizado (si lo tienes) y tu matriz.

Tercero

Declare una clase estática o cree una nueva si tiene un diseño de fila personalizado. Mi ejemplo tiene una clase estática:

 public static class Room_View{ //Declaration of Atributes TextView RoomName; ImageView RoomState; TextView NoTroubles; Button btnRoomRow; ImageButton btnShowRoomTasks; ImageButton btnAddTasks; RelativeLayout RowLayout; } 

Cuarto

Reemplace el método getView.

 @Override public View getView(int position, View ConvertView, ViewGroup parent) { //Declaration of Variables Room_View rowView; //Custom static class with controls LayoutInflater inflator = context.getLayoutInflater(); if (ConvertView == null) { rowView = new Room_View(); ConvertView = inflator.inflate(R.layout.room_layout,null,true); //Inflate your view with your custom view. rowView.RoomName = (TextView) ConvertView.findViewById(R.id.txtvRoom); rowView.RoomState = (ImageView) ConvertView.findViewById(R.id.ivRoomState); rowView.NoTroubles = (TextView) ConvertView.findViewById(R.id.txtvNoTroubles); rowView.btnRoomRow = (Button) ConvertView.findViewById(R.id.btnRoomRow); rowView.btnAddTasks = (ImageButton) ConvertView.findViewById(R.id.btnAddTask); rowView.btnShowRoomTasks = (ImageButton) ConvertView.findViewById(R.id.btnShowRoomTasks); rowView.RowLayout = (RelativeLayout) ConvertView.findViewById(R.id.rowLayout); ConvertView.setTag(rowView); } else { rowView = (Room_View) ConvertView.getTag(); } //Here custom your control stats Room_Object Room = Rooms_Array.get(position); rowView.RoomName.setText(Room.getRoomName()); rowView.NoTroubles.setVisibility(View.INVISIBLE); rowView.btnShowRoomTasks.setClickable(true); rowView.btnShowRoomTasks.setImageResource(R.drawable.list_3a4b66_50); rowView.btnShowRoomTasks.setOnClickListener(OnShowTasksClickListener); //This is for add ClickListiner in my buttons... rowView.btnAddTasks.setOnClickListener(OnAddTasksClickListener); rowView.btnRoomRow.setOnClickListener(OnAddTasksClickListener); if(Room.getStatus().equals("Checked")){ rowView.RowLayout.setBackgroundColor(0xFFC7E6C7); rowView.btnShowRoomTasks.setClickable(false); rowView.btnShowRoomTasks.setImageResource(R.drawable.list_999999_50); rowView.RoomState.setImageResource(R.drawable.check_3ebf4b_50); } else if(Room.getStatus().equals("Blocked")){ rowView.RowLayout.setBackgroundColor(0xFFDBC3E5); rowView.RoomState.setImageResource(R.drawable.key_9330e0_50); } else if(Room.getStatus().equals("Dirty")){ rowView.RowLayout.setBackgroundColor(0xfffceedb); rowView.RoomState.setImageResource(R.drawable.icon_housekeeping_3_yellow); } else if(Room.getStatus().equals("Troubled")){ rowView.RowLayout.setBackgroundColor(0xFFF4CECD); rowView.RoomState.setImageResource(R.drawable.wrench_eb3232_50); rowView.NoTroubles.setVisibility(View.VISIBLE); try { rowView.NoTroubles.setText(Integer.toString(Room.getNoTasks())); } catch (Exception ex){ Log.e("-- Error --",ex.getMessage()); } } // //Pay attention ************************************************* // //Now if you needs to use your custom external class this is the site, now imagine that you need gets string from your custom class in the text view, then: //Declare class CustomClass object = new CustomClass(); rowView.(CUSTOM CONTROL FROM YOUR STATIC CLASS).(METHOD OF CONTROL)(object.(CUSTOM METHOD OF YOUR OBJECT)); //For example If you follows my sample then: rowView.NoTroubles.setText(object.getNumberOfTroubles().toString); return ConvertView; } //Listener Methods for my button controls private View.OnClickListener OnShowTasksClickListener = new View.OnClickListener() { @Override public void onClick(View v) { int positionSelected = lvBuinding.getPositionForView((View) v.getParent()); int totalRooms = lvBuinding.getCount() - 1; int actualRoom = totalRooms - positionSelected; try{ //Your code; } catch (Exception ex){ Log.e("-- CustomError --", ex.getMessage()); } } }; private View.OnClickListener OnAddTasksClickListener = new View.OnClickListener() { @Override public void onClick(View v) { int positionSelected = lvBuinding.getPositionForView((View) v.getParent()); int totalRooms = lvBuinding.getCount() - 1; int actualRoom = totalRooms - positionSelected; try{ //Your code; } catch (Exception ex){ Log.e("-- CustomError --", ex.getMessage()); } } }; } 

Creo que esto es lo que necesitas, si necesitas más información o el mismo consejo, y yo trato de ayudarte … ¡Buena suerte, Eduardo!

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { CustomObject obj = allObjects.get(position); //Now use obj to access the property Uri uri = Uri.parse( "http://www.google.com" ); startActivity(new Intent(Intent.ACTION_VIEW, uri)); } }); 

Debe anular el getView de su adaptador para mostrar el objeto individual en una posición en su vista.