2011-12-30 14 views
7

Ho un'applicazione che recupera annunci memorizzati come file xml su un server e carica il titolo e l'autore di ciascun annuncio in un oggetto ListView. Quello che devo anche memorizzare con ogni articolo è l'ID di ogni annuncio, ma non ho effettivamente bisogno di visualizzarlo. Ho pensato di archiviare l'ID nella mappa di hash che uso per riempire l'elenco e poi trovare l'ID associato con il titolo cliccato, ma penso che non sarebbe sicuro da usare poiché due annunci potrebbero avere lo stesso titolo (e autore e data) . Ho anche pensato di aggiungere un TextView invisibile a ciascun elemento per memorizzare l'ID, ma questo ha causato problemi di layout. Infine, ho cercato e trovato setTag() e getTag() che penso sarebbe perfetto per quello che voglio fare, ma non sono sicuro di come usarli con SimpleAdapter (sono relativamente nuovo a questo ...). Se l'idea TextView è quello che ho bisogno di fare (anche se ne dubito), qui è la disposizione che sto utilizzando per ogni voce:Allegare dati ID agli articoli listview

<?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> 

E sto utilizzando la seguente scheda per riempire 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); 

Grazie per qualsiasi aiuto!

+0

Credo che qui è la risposta migliore per voi: http://stackoverflow.com/a/3051729/7379190 – AleX

+0

Penso che [questa] (http : //stackoverflow.com/a/3051729/7379190) è la migliore risposta alla tua domanda. – AleX

risposta

3

In teoria si potrebbero fare entrambi gli approcci e probabilmente funzionerà senza problemi. A lungo termine, tuttavia, direi che starai meglio con un oggetto entità semplice e un adattatore personalizzato. Più specificamente, a giudicare dall'aspetto, opterei per un ArrayAdapter e sembra che tu stia già utilizzando una sorta di semplice oggetto entità per l'array ann.

Ci sono un sacco di esempi che possono mostrarvi come estendere ArrayAdapter. La parte più importante, tuttavia, è il metodo getView(), che nella sua forma più semplice potrebbe apparire un po 'come questo:

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

Invece di creare un SimpleAdapter, ora creare un'istanza della vostra CustomAdapter, passaggio che l'array (o lista) degli oggetti entità, e impostare il tutto come adattatore alla lista:

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

visto che sei ora che fare con gli oggetti direttamente, al posto della prima creazione di un gruppo di rappresentanza stringhe fuori dei diversi campi, puoi anche accedere facilmente all'ID di ogni elemento. Ancora meglio, puoi aggiungere molti campi diversi senza preoccuparti di come apparirà nell'elenco, poiché la rappresentazione visiva è determinata da ciò che hai impostato (e non impostato) nel metodo getView() dell'adattatore.

+0

Sì, temevo di dover approfondire la creazione del mio adattatore personalizzato. Probabilmente è qualcosa che ho bisogno di imparare comunque, grazie per l'aiuto! Oh, e l'array 'ann' è una matrice di oggetti annuncio creati usando il parser XML semplice, solo fyi. :) – lancex

+0

Capisco che potrebbe essere un po 'un ostacolo da intraprendere per la prima volta, ma una volta capito, sono convinto che sarete d'accordo che ne è valsa la pena. Non preoccuparti se rimani bloccato a metà strada, ci sono sempre persone su SO per aiutarti. :) –

4

Voglio solo spiegare in modo più dettagliato la risposta di MH.
Nella tua myArrayAdapter classe getView funzione è possibile assegnare il proprio ID al View (che in realtà significa "fila") come questo:

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

E poi è necessario conoscere l'ID della riga quando (per esempio) l'utente ha fatto clic sulla riga e alcune attività dettagliate stanno per iniziare.

ho il mio ListView nel Fragment e questo è il pezzo di codice dal mio principale Activity, dalla dichiarazione di Fragment, collocato nella funzione 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); 
    } 
}); 

E infine ecco pezzo di codice da onCreate metodo della mia DetailActivity:

Bundle myExtras; 
int myItemId; 

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

Speranza che aiuta qualcuno ... :)
sono anche nuovi ad Android.
Big thank you a StackOverflow per tale aiuto per imparare lo sviluppo di Android :)

Problemi correlati