euh cad? de quelles 2 autres fonctions tu parle?
Version imprimable
Et les log je suppose que tu les a mis dans le onClick et onLongClick définie dans adapter?
j'en ai mis dans les onclic de l'adapter et de ma classe, mais il n'y a que ceux de l'adapter que s'affiche
--EDIT--
voici le code complet de mon adapter :
Mais vu que j'affiche bien les deux log que j'ai mis dans ce code, le pb vient pt maintenant de ma classe principale non?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108 public class AlarmeAdapter extends BaseAdapter{ private List<ListAlarme> mListA; public static int etat; public final static int ACKKED = 1; public final static int NO_ACKKED = 0; private Context mContext; private LayoutInflater mInflater; public AlarmeAdapter(Context context, List<ListAlarme> aListA, int state) { mContext = context; mListA = aListA; mInflater = LayoutInflater.from(mContext); etat = state; } public int getCount() { return mListA.size(); } public Object getItem(int position) { return mListA.get(position); } public long getItemId(int position) { return position; } public View getView(final int position, View convertView, ViewGroup parent) { LinearLayout layoutItem; if (convertView == null) { layoutItem = (LinearLayout) mInflater.inflate(R.layout.alarme_layout, parent, false); } else { layoutItem = (LinearLayout) convertView; } TextView alarmeID = (TextView)layoutItem.findViewById(R.id.alarme_id); TextView alarmeType = (TextView)layoutItem.findViewById(R.id.alarme_type); alarmeID.setText(mListA.get(position).idAlarme); alarmeType.setText(mListA.get(position).typeAlarme); if (etat == ACKKED ) { layoutItem.setBackgroundColor(Color.GRAY); } else { ListAlarme item = mListA.get(position); if (item.genre == ListAlarme.grave){ layoutItem.setBackgroundColor(Color.RED); } else if (item.genre == ListAlarme.defaut) { layoutItem.setBackgroundColor(Color.YELLOW); } } layoutItem.setTag(position); layoutItem.setOnLongClickListener(new OnLongClickListener(){ @Override public boolean onLongClick(View v) { Integer position = (Integer)v.getTag(); sendListener(mListA.get(position), position); System.out.println("clic long gérer par l'adapter"); return true; } }); layoutItem.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { System.out.println("clic court gérer par l'adapter"); sendListener(mListA.get(position), position); } }); return layoutItem; } private ArrayList<AlarmeAdapterListener> myListListener = new ArrayList<AlarmeAdapterListener>(); public void addListener(AlarmeAdapterListener aListener) { myListListener.add(aListener); } private ArrayList<AlarmeAdapterListener> mySecondListListener = new ArrayList<AlarmeAdapterListener>(); public void addListener2(AlarmeAdapterListener aListener2) { mySecondListListener.add(aListener2); } private void sendListener(ListAlarme item, int position) { for(int i = myListListener.size()-1; i >= 0; i--) { myListListener.get(i).OnLongClick(item, position); mySecondListListener.get(i).OnClick(item, position); } } public interface AlarmeAdapterListener { public boolean OnLongClick(ListAlarme item, int position); public void OnClick(ListAlarme item, int position); } public void setEtat (int nvetat) { etat = nvetat; } }
Oui oui c'était juste pour savoir.
Mais c'est normal je pense que ca passe seulement dans ceux de ton adapter, car c'est sur tes adapter que t'as définie un écouteur pour le clic court et long.
Possible de revoir le code de ta classe principale?
Bien sur :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 public class ManagementAlarm extends Activity implements AlarmeAdapterListener{ /** Called when the activity is first created. */ public static boolean var = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ArrayList<ListAlarme> listP = ListAlarme.getAListOfAlarms(); AlarmeAdapter adapter = new AlarmeAdapter(this, listP,AlarmeAdapter.NO_ACKKED); adapter.addListener(this); AlarmeAdapter adapter2 = new AlarmeAdapter(this, listP, 0); adapter2.addListener2(this); ListView list = (ListView)findViewById(R.id.listalarme); list.setAdapter(adapter); list.setAdapter(adapter2); var = false; } @Override public boolean OnLongClick(ListAlarme item, int position) { // var = true; /** System.out.println("onLongClick var =" + var); String idalr = ListAlarme.getAListOfAlarms().get(position).idAlarme; String typealr = ListAlarme.getAListOfAlarms().get(position).typeAlarme; int genrealr = ListAlarme.getAListOfAlarms().get(position).genre; Intent intenalr1 = new Intent(); intenalr1.putExtra("id", idalr); intenalr1.putExtra("type", typealr); intenalr1.putExtra("genre", genrealr); intenalr1.putExtra("Position", position); intenalr1.setClass(this, DetailAlarm.class); startActivity(intenalr1); */ System.out.println("Long click"); return false; } public void OnClick(ListAlarme item, int position) { // if (var == false){ System.out.println("onClick court"); /** System.out.println("itemIsclick"); registerForContextMenu((ListView)findViewById(R.id.listalarme)); openContextMenu((ListView)findViewById(R.id.listalarme));*/ // } } /**-----------------------------Barre de Menu----------------------------*/ public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater inflater = new MenuInflater(this); inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; } public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.ack:Toast.makeText(this, "select an alarm", Toast.LENGTH_LONG).show(); break; case R.id.ackall:Toast.makeText(this, "Acknowledge all alarms", Toast.LENGTH_LONG).show(); break; case R.id.reset:Toast.makeText(this, "Select an alarm", Toast.LENGTH_LONG).show(); break; case R.id.resetall:Toast.makeText(this, "Reset all alarms", Toast.LENGTH_LONG).show(); break; case R.id.update:Toast.makeText(this, " alarms update", Toast.LENGTH_LONG).show(); break; } return true; } /**---------------------------------menu contextuel-----------------------------------------*/ public void onCreateContextMenu(ContextMenu menu_item,View v,ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu_item, v, menuInfo); System.out.println("oncreate"); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_itemlist, menu_item); } public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.ack_item: Toast.makeText(this, "ack this item", Toast.LENGTH_SHORT).show(); return true; case R.id.reset_item: Toast.makeText(this, "reset this item", Toast.LENGTH_SHORT).show(); return true; } return super.onContextItemSelected(item); } }
Humm je pense que y'a pas d'appel du onClick et onLongClick de te classe principale parce que c'est des méthodes que tu implémentes via une interface crée, et ils ne sont pas lié aux autres.
Ce qui serai surement possible vu que tu passe le context à tes adapter, c'est dans les onLongClick et onClick appeler des fonctions lancementMenuContextuel() ou infoAlarme() (je sais pas comment les appeler) et dans ces fonction tu fais le code approprié...
En fait si je met deux adapter :
Je ne rentre pas du tout dans mes onclick et onlongclick de ma classe principalCode:
1
2
3
4
5
6
7
8
9
10 private ArrayList<AlarmeAdapterListener> myListListener = new ArrayList<AlarmeAdapterListener>(); public void addListener(AlarmeAdapterListener aListener) { myListListener.add(aListener); } private ArrayList<AlarmeAdapterListener> mySecondListListener = new ArrayList<AlarmeAdapterListener>(); public void addListener2(AlarmeAdapterListener aListener2) { mySecondListListener.add(aListener2); }
alors que si j'en met qu'un seul, je rentre dans les deux en même temps quelque soit le click ...
Et je n'ai aucune idée de comment régler l'un ou l'autre des pb
Mais déjà toi t'en veux un seul ou deux d'adapter? Qu'on se focalise sur le bon cas ^^
Je veux le cas qui marche, et le plus pratique à mettre en place
--EDIT--
Je ne sais pas lequel serait le mieux pour mon appli étant donné que je ne vois pas trés bien les conséquences à prendre un ou deux adapter.
Je pense que tu peux y arriver avec un seul et ca serai surement mieux pour n'avoir qu'une seule variable.
Euu je pense que tu pourrai faire un truc de ce style
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 layoutItem.setOnLongClickListener(new OnLongClickListener(){ @Override public boolean onLongClick(View v) { Integer position = (Integer)v.getTag(); sendListener(mListA.get(position), position,true); System.out.println("clic long gérer par l'adapter"); return true; } }); layoutItem.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { System.out.println("clic court gérer par l'adapter"); sendListener(mListA.get(position), position,false); } }); ///////////// private ArrayList<AlarmeAdapterListener> myListListener = new ArrayList<AlarmeAdapterListener>(); public void addListener(AlarmeAdapterListener aListener) { myListListener.add(aListener); } private void sendListener(ListAlarme item, int position, boolean longClick) { for(int i = myListListener.size()-1; i >= 0; i--) { if(longClick) { myListListener.get(i).OnLongClick(item, position); } else { myListListener.get(i).OnClick(item, position); } } }
ça m'a l'air d'être une idée pas mal, sauf que pour le if (longClick) j'ai creer une variable longclick boolean qui passe à true quand on fait un clique long et j'ai du me tromper quelque part parce que maintenant je n'affiche plus que le menu contextuel... mais au moins je l'affiche, on s'approche donc de la solution.
voici ce que j'ai changé dans mes deux classes:
classe adapter:
et dans la classe principale :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 private ArrayList<AlarmeAdapterListener> myListListener = new ArrayList<AlarmeAdapterListener>(); public void addListener(AlarmeAdapterListener aListener) { myListListener.add(aListener); } private void sendListener(ListAlarme item, int position) { for(int i = myListListener.size()-1; i >= 0; i--) { if (ManagementAlarm.longClick == true){ myListListener.get(i).OnLongClick(item, position); } else { myListListener.get(i).OnClick(item, position); } } }
Et j'ai mis que la variable longclick revenait à false à la fin de la 2éme activité. Mais je pense qu'il y a un autre moyen de tester si on fait un clic long, il faut juste le trouver.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 public boolean OnLongClick(ListAlarme item, int position) { longClick = true; lancementDetailAlarm(position); System.out.println("Long click"); return false; } public void OnClick(ListAlarme item, int position) { longClick = false; System.out.println("Click court"); lancementMenuContext(); }
c'est bon j'ai trouver il suffisait de rajouter :
et ça marche!!Code:
1
2
3
4
5
6
7
8
9
10 layoutItem.setOnLongClickListener(new OnLongClickListener(){ @Override public boolean onLongClick(View v) { ManagementAlarm.longClick = true; Integer position = (Integer)v.getTag(); sendListener(mListA.get(position), position); System.out.println("clic long gérer par l'adapter"); return true; } });
Merci beaucoup pour ton aide!
--EDIT--
En fait il n'y avait aucun changement à faire dans la classe principale, j'ai enlever les lignes
et ça marche nickelCode:
1
2 longClick = true; longClick = false;
Oui t'avais plus besoin des true et false dans ta classe principale ^^. Content d'avoir pu t'aider ;)