2011-12-30 5 views
7

J'ai une application qui récupère les annonces stockées en tant que fichiers xml sur un serveur et charge le titre et l'auteur de chaque annonce dans un élément ListView. Ce que j'ai également besoin de stocker avec chaque élément est l'ID de chaque annonce, mais je n'ai pas vraiment besoin de l'afficher. J'ai pensé à peut-être stocker l'ID dans la carte de hachage que j'utilise pour remplir la liste et ensuite trouver l'ID associé avec le titre cliqué mais je pense qu'il serait dangereux d'utiliser puisque deux annonces pourraient avoir le même titre (et auteur et date) . J'ai également pensé à ajouter un TextView invisible à chaque élément pour stocker l'ID, mais cela causait des problèmes de mise en page. Enfin, j'ai cherché autour de et trouvé setTag() et getTag() qui je pense serait parfait pour ce que je veux faire, mais je ne suis pas vraiment sûr de savoir comment les utiliser avec SimpleAdapter (je suis relativement nouveau à ce ...). Si l'idée est TextView ce que je dois faire (bien que je doute), voici la mise en page que je utilise pour chaque élément:Joindre des données d'ID aux éléments 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> 

Et j'utilise l'adaptateur ci-dessous pour remplir la liste:

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

Nous vous remercions de votre aide!

+0

Je pense ici est la meilleure réponse pour vous: http://stackoverflow.com/a/3051729/7379190 – AleX

+0

Je pense que [ce] (http : //stackoverflow.com/a/3051729/7379190) est la meilleure réponse à votre question. – AleX

Répondre

3

Théoriquement, vous pouvez faire les deux approches et cela fonctionnera probablement sans problèmes. À long terme, cependant, je dirais que vous serez mieux avec un simple objet entité et un adaptateur personnalisé. Plus précisément, d'après son apparence, j'opterais pour un ArrayAdapter, et vous semblez déjà utiliser une sorte d'objet entité simple pour le tableau ann.

Il existe des tonnes d'exemples qui peuvent vous montrer comment étendre ArrayAdapter. La partie la plus importante est cependant la méthode getView(), qui il forme la plus élémentaire pourrait ressembler un peu comme ceci:

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

Au lieu de créer un SimpleAdapter, créez maintenant une instance de votre CustomAdapter, le passer, votre tableau (ou liste) des objets d'entité et définir l'ensemble comme adaptateur à votre liste:

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

Puisque vous êtes maintenant traiter les objets directement, au lieu de créer d'abord un groupe de représentation des chaînes de différents champs, vous pouvez également accéder facilement à l'identifiant de chaque article. Mieux encore, vous pouvez ajouter un grand nombre de champs différents sans vous soucier de leur apparence dans la liste, puisque la représentation visuelle est déterminée par ce que vous définissez (et ne définissez pas) dans la méthode getView() de votre carte.

+0

Ouais j'avais peur que je devrais fouiller dans la création de mon propre adaptateur personnalisé. C'est probablement quelque chose que j'ai besoin d'apprendre quand même, merci pour l'aide! Oh, et le tableau 'ann' est un tableau d'objets d'annonce créés en utilisant l'analyseur Simple XML, juste fyi. :) – lancex

+0

Je comprends que ce soit un peu difficile à entreprendre pour la première fois, mais une fois que vous l'aurez compris, je suis convaincu que vous serez d'accord pour dire que ça en valait la peine. Pas de soucis si vous êtes coincé à mi-chemin, il y a toujours des gens sur SO pour aider. :) –

4

Je veux juste expliquer dans un peu plus de détail la réponse de MH.
Dans votre classe myArrayAdapter en getView fonction, vous pouvez assigner votre ID au View (qui signifie « ligne ») comme ceci:

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

Et alors vous devez connaître l'ID de la ligne lorsque (par exemple L'utilisateur a cliqué sur la ligne et une activité détaillée va démarrer.

J'ai mon ListView dans le Fragment et c'est le morceau de code de mon principal Activity, de la déclaration de Fragment, placé dans la fonction 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); 
    } 
}); 

Et est enfin là morceau de code onCreate méthode de mon DetailActivity:

Bundle myExtras; 
int myItemId; 

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

it helps quelqu'un ... :)
Je suis aussi nouveau à Android.
Big thank you à Stackoverflow pour une telle aide dans l'apprentissage du développement Android :)

Questions connexes