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
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);
 
        }
 
    }
}
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
 
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) {
 
        }
    }
 
}
J'ai essayer de mettre les listener dans la classe adapter, dans la mainActivity, mais rien.
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 !