Où dois-je placer le onClickListener sur un Custom ListView?
Je fais un custom ListView
de lignes contenant un CheckBox
et un TextView
. Avant j'ai utilisé personnalisé ListViews
avec SimpleCursorAdapter, mon onListItemClick()
a bien fonctionné.
Je l'ai lu, j'ai du ajouter un onClickListener
à mon TextViews
mais OÙ? Et POURQUOI?
Je suis toujours à l'extension de ListActivity
et passer un Adapter
à setListAdapter(listedPuzzleAdapter);
, ne suis-je pas?
public class PuzzleListActivity extends ListActivity {
private PuzzlesDbAdapter mDbHelper;
private Cursor puzzlesCursor;
private ArrayList<ListedPuzzle> listedPuzzles = null;
private ListedPuzzleAdapter listedPuzzleAdapter;
private class ListedPuzzleAdapter extends ArrayAdapter<ListedPuzzle> {
private ArrayList<ListedPuzzle> items;
public ListedPuzzleAdapter(Context context, int textViewResourceId,
ArrayList<ListedPuzzle> items) {
super(context, textViewResourceId, items);
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.puzzles_row, null);
}
ListedPuzzle lp = items.get(position);
if (lp != null) {
TextView title = (TextView) v.findViewById(R.id.listTitles);
title.setText(lp.getTitle());
CheckBox star = (CheckBox) v.findViewById(R.id.star_listed);
star.setChecked(lp.isStarred());
}
return v;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.puzzles_list);
//Create database helper to open connection
mDbHelper = new PuzzlesDbAdapter(this);
mDbHelper.open();
fetchData();
}
private void fetchData() {
puzzlesCursor = mDbHelper.fetchAllPuzzles();
startManagingCursor(puzzlesCursor);
listedPuzzles = new ArrayList<ListedPuzzle>();
ListedPuzzle lp;
puzzlesCursor.moveToFirst();
while (!puzzlesCursor.isAfterLast()) {
lp = new ListedPuzzle();
lp.setTitle(puzzlesCursor.getString(puzzlesCursor
.getColumnIndex(PuzzlesDbAdapter.KEY_TITLE)));
lp.setStarred(puzzlesCursor.getInt(puzzlesCursor
.getColumnIndex(PuzzlesDbAdapter.KEY_STARRED)) > 0);
listedPuzzles.add(lp);
puzzlesCursor.moveToNext();
}
listedPuzzleAdapter = new ListedPuzzleAdapter(this,
R.layout.puzzles_row, listedPuzzles);
setListAdapter(listedPuzzleAdapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Intent i = new Intent(this, PuzzleQuestionActivity.class);
i.putExtra(PuzzlesDbAdapter.KEY_ROWID, id);
startActivity(i);
}
EDIT: Ma question était vers la réalisation de l'intégralité de l'élément d'une coutume ListView
cliquable donc j'ai trouvé la meilleure réponse est celle donnée par @Luksprog. Le onListItemClick
de mon ListActivity
était assez. J'ai juste besoin de définir la android:focusable='false'
pour le faire fonctionner.
Maintenant, le CheckBox
sur chaque élément de la ListView
devrait "star" de cet élément, ce qui signifie, accès aux à la DB.
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.puzzles_row, null);
}
ListedPuzzle lp = items.get(position);
if (lp != null) {
TextView title = (TextView) v.findViewById(R.id.listTitles);
title.setText(lp.getTitle());
CheckBox star = (CheckBox) v.findViewById(R.id.star_listed);
star.setChecked(lp.isStarred());
star.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
Integer realPosition = (Integer) v.getTag();
ListedPuzzle obj = items.get(realPosition);
obj.getId();
}
});
}
return v;
}
Mais la v.getTag()
se réfère à un non-dernière variable et si je change le v = vi.inflate(R.layout.puzzles_row, null)
ne peut pas être affecté.
Quelle est la meilleure façon de résoudre ce problème? Je n'ai jamais vraiment compris l'ensemble de l'accord final.
voulez-vous
TextView
ClickLisner?Je veux lancer une autre activité.
OriginalL'auteur eskalera | 2012-05-16
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez ajouter une action spéciale pour lorsque vous cliquez sur le
TextView
ou/etCheckBox
partir de l'une des lignes de votreListView
puis ajouter unOnCLickListener
pour ceuxViews
dans legetView
méthode de votre personnaliséAdapter
:Si vous voulez faire une action quand une ligne est cliqué(n'importe quoi
View
à partir de cette ligne a été cliqué(si l'on a cliqué)) suffit d'utiliser laOnItemClickListener
sur votreListView
(ou le rappelonListItemClick
dans le cas d'unListActivity
).Aussi, j'espère que vous définissez
android:focusable="false"
pour laCheckBox
(enR.layout.puzzles_row
) parce que je ne pense pas queonListItemClick
va travailler autrement.Edit :
Vous démarrez la nouvelle
Activity
dans leonListItemClick
(dans le cas de laListActivity
) rappel si vous souhaitez démarrer une nouvelle activité n'importe où l'utilisateur clique sur une ligne:Si, pour une raison quelconque, vous voulez commencer la nouvelle
Activity
lorsque l'utilisateur clique sur seulement(par exemple) leTextView
dans unListView
ligne, puis démarrer une nouvelle activité dans leonClick
méthode à partir de mon code ci-dessus:Pour que cela fonctionne, vous devrez modifier
ListedPuzzle
également ajouter laPuzzlesDbAdapter.KEY_ROWID
colonne à partir de lapuzzlesCursor
curseur dans lafetchData()
méthode:Voir mon édité réponse(aussi regarder mes
getView
le code de la méthode). Vous mettez le code pour lancer la nouvelleActivity
en fonction de ce que vous essayez de faire.Thaaaanks tellement @Luksprog, Cristal clair en ce moment. A finalement obtenu ce travail. Mon cas était la première mais la deuxième extrait résolu tous mes doutes. J'ai juste eu à ajouter
i.putExtra(PuzzlesDbAdapter.KEY_ROWID, id + 1);
depuis la liste de tableaux commence à 0 à la différence du Curseur.J'ai fait un peu de changement reflète sur mon montage ci-dessus. Il y a encore un peu de doute au sujet de votre solution.
Vous ne comprenez pas ma réponse. Vous définissez la
position
comme une balise pour l'View
sur lequel vous avez également définir l'auditeur, de même pour votreCheckBox
:star.setTag(new Integer(position));
. Dans l'écouteur, vous obtenez une référence à laView
qui a été vérifié, c'est lebuttonView
paramètre de sorte que vous ne:Integer realPosition = (Integer) buttonView.getTag();
. Vous n'avez pas affaire avec lav
objet(lafinal
problème vient de ce que vous essayez d'accéder à une variable à partir d'un anonyme intérieur de la classe).OriginalL'auteur Luksprog
vous pouvez affecter un
onClickListener
dans la carte, mais c'est une mauvaise pratique.ce que vous devez faire, est de mettre en œuvre
onItemClick
comme ceci:faites-vous une favore et de mettre en œuvre la
onItemClick
et PAS le onCLick. il est conçu pour les listesOuch! Bien sûr! Tu veux dire mettre en application cette interface sur ma carte. Ok, désolé.
Je ne sais pas si vous avez compris.
onItemClick
est attribué à la liste dans votre activité principale.onClick
est destiné à un seul des éléments. et peut être attribuée dans lesgetView
mais c'est MAUVAISE PRATIQUE et ne doit pas être faitPouvez-vous s'il vous plaît dites-moi pourquoi c'est une mauvaise pratique? Dans une ligne de ma liste, j'ai besoin de 2 boutons. J'AI donc À mettre en œuvre onClick sur chaque bouton de l'adaptateur. Je sais qu'il y a des problèmes avec cette approche, mais je ne connais pas d'autre façon de le faire
OriginalL'auteur thepoosh
Vous devez mettre en œuvre onItemClickListener sur votre Liste.
OriginalL'auteur galex
Utiliser onClick Listner dans votre carte uniquement. Dans votre adaptateur vous sont de retour v qui est vue kiond de l'objet. Y mettre votre onCLickListener.
par exemple v. setOnCLickListener.
Je suis en gardant à l'esprit que vous souhaitez ouvrir une activité sur cliquez de vue. Et oui, si votre ListedPuzzle classe serializable ou parcelable vous pouvez transférer totalité de l'objet à l'aide de putextra méthode d'intention de même.
Si vous n'êtes pas clair avec réponse me dire, je vais vous donner samll extrait de code
OriginalL'auteur Hardik Trivedi
OriginalL'auteur c2dm