Cómo adjuntar datos de ID a elementos de vista de lista

Tengo una aplicación que busca anuncios almacenados como archivos xml en un servidor y carga el título y el autor de cada anuncio en un elemento ListView. Lo que también necesito almacenar con cada artículo es el ID de cada anuncio, pero en realidad no necesito mostrarlo. Pensé en almacenar quizá la identificación en el mapa del hash que utilizo para llenar la lista y después encontrar la identificación asociada con el título chascado pero pienso que sería inseguro usarlo puesto que dos anuncios podrían tener el mismo título (y autor y fecha) . También pensé en añadir un TextView invisible a cada elemento para almacenar el ID, pero que estaba causando problemas de diseño. Por último, busqué alrededor y encontré setTag () y getTag () que creo que sería perfecto para lo que quiero hacer, pero no estoy muy seguro de cómo usarlos con SimpleAdapter (soy relativamente nuevo en esto … ). Si la idea de TextView es lo que necesito hacer (aunque lo dude), he aquí el diseño que estoy usando para cada elemento:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@android:id/text1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="6dip" android:textAppearance="?android:attr/textAppearanceMedium"/> <LinearLayout android:orientation="horizontal" android:id="@+id/items" android:weightSum="100" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@android:id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="6dip" android:textAppearance="?android:attr/textAppearanceSmall" android:layout_weight="85"/> <LinearLayout android:orientation="vertical" android:id="@+id/itemCB" android:layout_weight="15" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center"> <CheckBox android:id="@+id/cbSelected" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout> </LinearLayout> 

Y estoy usando el siguiente adaptador para llenar la lista:

 for(int i = 0; i < ann.length; i++) { map = new HashMap<String, String>(); map.put("line1", ann[i].getTitle()); map.put("line2", "Posted by: " + ann[i].getAuthor() + "\n" + ann[i].date.toLongString()); list.add(map); } String[] from = { "line1", "line2"}; int[] to = { android.R.id.text1, android.R.id.text2}; SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.twoline_checkbox_id_listitem, from, to); setListAdapter(adapter); 

¡Gracias por cualquier ayuda!

Teóricamente usted podría hacer cualquiera de los dos enfoques y probablemente funcionará sin problemas. Sin embargo, a largo plazo, diría que estarás mejor con un objeto de entidad simple y un adaptador personalizado. Más específicamente, por lo que parece, yo optaría por un ArrayAdapter, y ya parece estar utilizando algún tipo de objeto de entidad simple para la matriz ann .

Hay un montón de ejemplos que pueden mostrar cómo extender ArrayAdapter. La parte más importante sin embargo es el método getView() , que en su forma más básica podría verse algo así:

 public View getView(int position, View convertView, ViewGroup parent) { View row; if (null == convertView) { row = mInflater.inflate(R.layout.list_item, null); } else { row = convertView; } MyObject item = (MyObject) getItem(position); TextView tv = (TextView) row.findViewById(android.R.id.xxx); tv.setText(item.getTitle); // same for other fields/views; eg author, date etc return row; } 

En vez de crear un SimpleAdapter, ahora cree una instancia de su CustomAdapter, pase su matriz (o lista) de objetos de entidad y establezca el conjunto como adaptador en su lista:

 MyObject[] objects = ... setListAdapter(new ArrayAdapter<string>(this, R.layout.list_item, objects)); 

Puesto que ahora estás tratando directamente con los objetos, en lugar de crear primero un montón de cuerdas de representación de los diferentes campos, también puedes acceder fácilmente al 'id' de cada elemento. Incluso mejor, puede agregar un montón de campos diferentes sin preocuparse de cómo se verá en la lista, ya que la representación visual está determinada por lo que estableció (y no se establece) en el método getView() de su adaptador.

Sólo quiero explicar en poco más detalle la respuesta de MH.
En su clase myArrayAdapter en la función getView , puede asignar su ID a la View (que en realidad significa "fila") de la siguiente manera:

 public View getView(int position, View convertView, ViewGroup parent){ View v = convertView; if (v == null) { LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = inflater.inflate(mItemLayout, null); } String[] dataForOneRow = this.allRowsData.get(position); // Tag is expected to be an Object (Integer is an object) // our data are in String array - that's why we need to convert it into Integer // I assume here, your ID number is first item (No.0) in the array of data v.setTag(new Integer( Integer.valueOf(dataForOneRow[0]) )); /* ...here you will set your data to display in your TextViews... */ return v; } 

Y entonces usted necesita saber el ID de la fila cuando (por ejemplo) el usuario ha hecho clic en la fila y se va a iniciar una Actividad detallada.

Tengo mi ListView en el Fragment y este es el pedazo de código de mi Activity principal, de la declaración de Fragment , colocado en la función onCreateView :

 // here we assign "onClick listener" when user clicks a row myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent myRowClickIntent = new Intent(getActivity(), myDetailActivity.class); // we can send some data to the new Activity through "extras" // remember - our Tag is an object (Integer object) but putExtra() awaits some integer or string or some other type // so here we are saying that it should be understood/treated as an Integer myRowClickIntent.putExtra("item_id", (Integer)view.getTag() ); startActivity(myRowClickIntent); } }); 

Y finalmente aquí está pedazo de código del método de onCreate de mi DetailActivity:

 Bundle myExtras; int myItemId; myExtras = getIntent().getExtras(); if (myExtras != null) { myItemId = myExtras.getInteger("item_id"); } 

Espero que ayude a alguien … 🙂
También soy nuevo en Android.
Muchas thank you a StackOverflow por esa ayuda en el desarrollo de Android de aprendizaje 🙂

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