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);
}
}
À 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
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). –
@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