Bonjour,
Je débute en Android, (et j'avoue aussi un peu en java).
J'ai un recyclerView qui m'affiche une liste d'item. Je souhaite, lorsque je "pose" le doigt dessus, que la ligne en question change de couleur.
J'ai essayer différentes choses, mais jamais de résultat.(OntouchListener, onFocusChange, onClick, etc...)
Voici les codes utilisés :
Le recyclerViewAdapter
Le mainActivity
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
109
110
111 public class RecyclerSimpleViewAdapter extends RecyclerView.Adapter<RecyclerSimpleViewAdapter.ViewHolder> { private static final int TYPE_ADAPTERVIEW = 2; //Liste des items private List<RucheModel> items; //Context Context context; /*Constructer de l'adapter RecyclerSimpleViewAdapter items : liste des items context : le contexte */ public RecyclerSimpleViewAdapter(Context context,List<RucheModel> items) { this.items=items; this.context=context; } /* Creation View Holder par type parent : la vue parent viewtype : le type de view */ @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //Récupère l'inflater (mise en place dans le layout) et récupère la vue par l'id du itemlayout /* View v= LayoutInflater.from(parent.getContext()).inflate(itemLayout,parent,false); return new ViewHolder(v);*/ LayoutInflater inflater=(LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); View convertView; convertView=inflater.inflate(R.layout.item,parent,false); // convertView.setOnClickListener(new MyOnClickListener()); avant return new ViewHolder(convertView); } //Récupère la taille des items dans l'adapter //et la renvoie @Override public int getItemCount() { return items.size(); } /*lie le View Holder et les items holder : le view holder position : la position courante */ @Override public void onBindViewHolder(ViewHolder holder, int position) { //Récupère l'item par sa position RucheModel item=items.get(position); //On récupère l'image holder.primaryImage.setBackgroundResource(item.getResId()); holder.primaryText.setText(item.getTitle()); holder.primaryText.setTag(item.getTitle()); // holder.itemView.setTag(item.getTitle()); Testé pour le onclick //Sauve l'info dans le holder, on a qu'un type dans cet adapter //On alterne les couleurs if((position%2)==0) { holder.itemView.setBackgroundResource(R.color.color1); } else { holder.itemView.setBackgroundResource(R.color.color2); } } public int getItemViewType(int position) { return TYPE_ADAPTERVIEW; } //Retire un item public void removeItem(int position) { int max=items.size(); notifyItemRemoved(position); items.remove(position); } public void addItem(RucheModel item, int position) { notifyItemInserted(position); items.add(position, item); } /*Class ViewHolder : instantie la vue d'un item itemView : l'itemView */ class ViewHolder extends RecyclerView.ViewHolder { public TextView primaryText; public ImageView primaryImage; public View rootView; //Construction de la classe //itemView : l'itemView public ViewHolder(View itemView) { super(itemView); rootView=itemView; //Lien vers l'image primaryImage=(ImageView) itemView.findViewById(R.id.image); primaryText = (TextView) itemView.findViewById(R.id.titre); } } }
J'ai essayer de mettre les listener dans la classe adapter, dans la mainActivity, mais rien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Récupération du recyclerview RecyclerView recyclerView = (RecyclerView) findViewById(R.id.myListSimple); //Creation de la liste à intégrer dans le recycler List<MonObjectModel> items = new ArrayList<MonObjectModel>(); //remplissage de la liste for (int i=0; i<6; i++) { MonObjectModel mOM=new MonObjectModel(); mOM.setTitle("Item "+i); int drawableResourceId=this.getResources().getIdentifier("toto","drawable",getPackageName()); mOM.setResId(drawableResourceId); items.add(mOM); } //creation de l'adapter qui recevra la liste. Le recyclerViewAdapter est créé dans une autre classe RecyclerSimpleViewAdapter adapter = new RecyclerSimpleViewAdapter(MainActivity.this,items); recyclerView.setAdapter(adapter); //Connecte le layout recyclerview a notre adapter perso MyGridLayoutManager layoutManager=new MyGridLayoutManager(this, 1, items); recyclerView.setLayoutManager(layoutManager); recyclerView.addOnItemTouchListener(new RecyclerTouchListener(this, recyclerView, new ClickListener() { @Override public void onClick(View view, final int position) { //Values are passing to activity & to fragment as well Toast.makeText(MainActivity.this, "Single Click on position :"+position, Toast.LENGTH_SHORT).show(); } @Override public void onLongClick(View view, int position) { Toast.makeText(MainActivity.this, "Long press on position :"+position, Toast.LENGTH_LONG).show(); } })); } public static interface ClickListener { public void onClick(View v,int position); public void onLongClick(View v,int position); } class RecyclerTouchListener implements RecyclerView.OnItemTouchListener{ private ClickListener clicklistener; private GestureDetector gestureDetector; // public RecyclerTouchListener(Context context, final RecyclerView recycleView, final ClickListener clicklistener){ this.clicklistener=clicklistener; gestureDetector=new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){ @Override public boolean onSingleTapUp(MotionEvent e) { return true; } @Override public void onLongPress(MotionEvent e) { View child=recycleView.findChildViewUnder(e.getX(),e.getY()); if(child!=null && clicklistener!=null){ clicklistener.onLongClick(child,recycleView.getChildAdapterPosition(child)); } } }); } @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { View child=rv.findChildViewUnder(e.getX(),e.getY()); if(child!=null && clicklistener!=null && gestureDetector.onTouchEvent(e)){ clicklistener.onClick(child,rv.getChildAdapterPosition(child)); } return false; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } } }
Comme je dois passer un intent vers une nouvelle activité en faisant un click, c'est pour cela que j'i implémenté le click dans le main.
Donc, deuxième question bonus, est-ce la bonne place ?
merci de votre aide !
Partager