2010-12-10 5 views
0

Le titre de cette question était peut-être mauvais, mais il était difficile de trouver un titre. Alors, voici la question.Android Accès aux éléments à partir d'une liste personnaliséeOnglet

J'ai une application qui ouvre une base de données et crée un ListView personnalisé basé sur le contenu. Il y a donc quelques fichiers impliqués dans ce processus:

Main.java - opens the database and stores the List<MyClass> of contents 
main.xml - main activity layout with the ListView 
MyAdapter.java - extends BaseAdapter and calls MyAdapterView based on the context 
MyAdapaterView.java - inflates the View from MyAdapater based on row.xml 
row.xml - layout of each custom row of the ListView 

Cela fonctionne très bien. Je suis nouveau sur Android, mais structurellement cela semble être la façon dont tout le monde recommande de construire ListViews personnalisés.

Comment puis-je récupérer des données à partir du ListView? Par exemple, une partie de la ligne est une case à cocher. Si l'utilisateur appuie sur la case à cocher pour activer/désactiver la ligne particulière, comment puis-je en informer l'application principale?

Merci,

EDIT:

Main.java

public class MyApplication extends Activity 
    implements OnItemClickListener, OnItemLongClickListener 
{ 
    private List<MyClass> objects; 
    private ListView lvObjects; 
    private MyAdapter myAdapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     objects = new ArrayList<MyClass>(); // setup the list 
     lvObjects = (ListView)findViewById(R.id.lvObjectList); 
     lvObjects.setOnItemClickListener(this); 
     lvObjects.setOnItemLongClickListener(this); 

     loadDatabase(DATABASE); 

     myAdapter = new MyAdapter(this, objects); 
     lvObjects.setAdapter(myAdapter); 
    } 

    ... 

    public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
    {  
     // This is executed when an item in the ListView is short pressed 
    } 

    public void onItemLongClick(AdapterView<?> parent, View v, int position, long id) 
    { 
     // This is executed when an item in the ListView is long pressed 

     registerForContextMenu(lvObjects); 
     v.showContextMenu(); 
    } 

MyAdapter.java

public class MyAdapter extends BaseAdapter 
{ 
    private Context context; 
    private List<MyClass> list; 

    public RuleAdapter(Context context, List<MyClass> list) 
    { 
     this.context = context; 
     this.list = list; 
    } 

    ... 

    public View getView(int position, View view, ViewGroup viewGroup) 
    { 
     MyClass entry = list.get(position); 
     return new MyAdapterView(context,entry); 
    } 
} 

MyAdapterView.java

public class MyAdapterView extends LinearLayout 
{ 
    public MyAdapterView(Context context, MyClass entry) 
    { 
     super(context); 

     this.setOrientation(VERTICAL); 
     this.setTag(entry); 

     View v = inflate(context, R.layout.row, null); 

     // Set fields based on entry object 

     // When this box is checked or unchecked, a message needs to go 
     // back to Main.java so the database can be updated 
     CheckBox cbActive = (CheckBox)v.findViewById(R.id.cbActive); 

     addView(v); 
    } 
} 

Répondre

1

Comment puis-je récupérer des données à partir du ListView?

Si vous voulez savoir quel élément dans le ListView a cliqué, vous utilisez un OnItemClickListener et Listview.setOnItemClickListener. Il y a un exemple de ceci dans le tutoriel Hello ListView. Une fois que vous savez quel élément est sélectionné, vous connaissez alors la position de cet élément dans l'ensemble Adapter, et vous avez le View. Vous pouvez utiliser la vue pour obtenir des sous-éléments si nécessaire, généralement si la position est suffisante pour vous faire savoir quelle partie de votre "modèle" a été cliquée. Dans votre exemple, il vous dira exactement quel élément de votre List<MyClass> a été cliqué.

Si vous souhaitez faire la distinction entre l'élément de liste sur lequel vous cliquez et une vue pouvant être mise en évidence dans l'élément de liste (comme une case à cocher), c'est un peu plus complexe. La case à cocher, par défaut, détournera le focus de l'élément de liste. Vous pouvez basculer ceci et le rendre faux, selon ce que vous essayez de faire. Voir this question pour plus d'informations.

Si vous devez faire la distinction entre le clic sur l'élément ListView et le clic CheckBox, il existe plusieurs façons. Une façon est de simplement maintenir l'état de cliquer ou non sur un élément à l'intérieur de l'adaptateur.

Par exemple:

MovieAdapter

MyMovies (ListView)

Ensuite, il suffit d'utiliser la normale "onListItemClick" et l'adaptateur pour dire ce qui est cliqué et ce n'est pas. (Ceci est juste une façon de faire cela, il y en a plusieurs.)

+0

À droite, CheckBox prend le focus de la ligne ListView donc dans le fichier XML j'ai mis le CheckBox à 'android: focusable =" false "'. Cela fonctionne et me permet d'écouter les clics courts et longs ListViews. Mais maintenant, comment puis-je écouter à la fois le CheckBox et la ligne? Lorsque la ligne est pressée, un ContextMenu apparaît qui fonctionne correctement. Mais lorsque le CheckBox est coché ou décoché, j'ai besoin d'envoyer un message à l'application pour mettre à jour la base de données. Comment est-ce que je fais cela sans que le 'onClickListener' soit activé? – linsek

+0

J'ai mis à jour la réponse avec un exemple sur lequel j'ai travaillé récemment. Je ne suis pas sûr que ce soit exactement ce que vous demandez, mais il utilise la case à cocher dans listview et devrait vous permettre d'aller dans la bonne direction (peut-être). –

+0

@Charlie - J'ai mis à jour mon poste avec l'application principale. J'ai regardé l'exemple que vous avez mentionné, mais je ne suis pas tout à fait sûr que ce soit ce que je cherche. Le problème est que j'ai besoin de trois processus différents pour avoir lieu. 1- Lorsque la ligne ListView est enfoncée, exécutez l'exécution. 2- Lorsque vous appuyez longuement sur la ligne ListView, ouvrez un menu contextuel. 3- Lorsque le CheckBox de la ligne est coché ou décoché, mettez à jour la base de données que cet objet sera actif ou inactif. J'utilise déjà onItemClick et onItemLongClick pour satisfaire les deux premiers. – linsek

0

Vous avez donc un adaptateur de curseur personnalisé qui crée les vues? Lorsque vous créez la vue dans getView(), il suffit de configurer un écouteur sur cette vue pour écouter ce que vous voulez. Probablement onClick

+0

Non, ce n'est pas un CursorAdapter. Pourriez-vous expliquer comment configurer un écouteur dans getView()? J'ai modifié le post pour contenir mon adaptateur et AdapterView. Merci – linsek

Questions connexes