2011-12-30 12 views
7

Tengo una aplicación que recupera 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 debo almacenar con cada artículo es la identificación de cada anuncio, pero en realidad no necesito mostrarlo. Pensé en almacenar la ID en el mapa hash que uso para completar la lista y luego encontrar la ID asociada con el título seleccionado, pero creo que sería inseguro utilizarlo ya que dos anuncios podrían tener el mismo título (y autor y fecha) . También pensé en agregar un TextView invisible a cada elemento para almacenar el ID, pero eso estaba causando problemas de diseño. Por último, busqué y encontré setTag() y getTag(), que creo que sería perfecto para lo que quiero hacer, pero no estoy seguro de cómo usarlos con SimpleAdapter (soy relativamente nuevo en esto ...) Si la idea de Vista de Texto es lo que tengo que hacer (aunque lo dudo), aquí está el diseño que estoy usando para cada elemento:Adjuntando datos de identificación a elementos de vista de lista

<?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 la ayuda!

+0

Creo que aquí es la mejor respuesta para usted: http://stackoverflow.com/a/3051729/7379190 – AleX

+0

creo que [esto] (http : //stackoverflow.com/a/3051729/7379190) es la mejor respuesta a su pregunta. – AleX

Respuesta

3

En teoría, podría hacer cualquier aproximación y probablemente funcione sin problemas. A la larga, sin embargo, diría que será mejor con un objeto de entidad simple y un adaptador personalizado. Más específicamente, a juzgar por su aspecto, optaría por un ArrayAdapter, y ya parece estar usando algún tipo de objeto de entidad simple para el arreglo ann.

Hay muchos ejemplos que pueden mostrarle 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 ser algo como esto:

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; e.g. author, date etc 

    return row; 
} 

En lugar de crear un SimpleAdapter, ahora crear una instancia de su CustomAdapter, pasarla a la matriz (o lista) de objetos de entidad, y establecer el conjunto como adaptador a su lista:

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

ya que eres ahora se trata de los objetos directamente, en lugar de crear primero un manojo de cuerdas representación de los diferentes campos, también puede acceder fácilmente a la 'id' de cada elemento. Aún mejor, puede agregar una gran cantidad de campos diferentes sin preocuparse de cómo se verá en la lista, ya que la representación visual está determinada por lo que establece (y no establece) en el método getView() de su adaptador.

+0

Sí, tenía miedo de tener que profundizar en la creación de mi propio adaptador personalizado. Sin embargo, es probable que sea algo que deba aprender de todos modos, ¡gracias por la ayuda! Ah, y la matriz 'ann' es una matriz de objetos de anuncio creados con el analizador Simple XML, solo fyi. :) – lancex

+0

Entiendo que podría ser un poco difícil de llevar a cabo por primera vez, pero una vez que lo haya resuelto, estoy convencido de que aceptará que valió la pena el esfuerzo. No te preocupes si te quedas a medio camino, siempre hay personas en SO para ayudar. :) –

4

Solo quiero explicar con un poco más de detalle la respuesta de MH.
En su myArrayAdapter clase en getView función puede asignar su ID a la View (que en realidad significa "fila") así:

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 lo que necesita saber el ID de la fila cuando (por ejemplo,) el usuario hizo clic en la fila y se iniciará una actividad detallada.

tengo mi ListView en el Fragment y esta es la parte de código de mi principal Activity, a partir 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í es parte del código de onCreate método 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 nueva a Android.
Gran thank you a Stackoverflow para este tipo de ayuda en el aprendizaje de desarrollo de Android :)

Cuestiones relacionadas