J'ai donc un LinearLayout mis en place dans mon fichier XML, et j'y ajoute dynamiquement un tas de CardViews via du code au démarrage de mon activité. Comment puis-je faire en sorte que lorsque je clique sur l'un des CardViews, je puisse obtenir sa position?
J'ai essayé de configurer un onClickListener
pour le LinearLayout, ainsi qu'un OnClickLIstener pour chaque carte individuelle, mais je n'ai pas trouvé de moyen d'obtenir l'index de la carte sur laquelle on a cliqué.
J'aimerais vraiment savoir où mettre le onClickListener
, et comment obtenir la position sur laquelle j'ai cliqué afin que je puisse démarrer une nouvelle activité en fonction de ce qui a été cliqué.
Voici mon code:
private LinearLayout sLinearLayout; private CardView[] cardViews; private Workout[] workouts; private ViewGroup.LayoutParams params; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.saved_workouts); Intent intent = getIntent(); Parcelable[] parcelableArrayExtra = intent.getParcelableArrayExtra(MainActivity.EXTRA_WORKOUTS); workouts = new Workout[parcelableArrayExtra.length]; System.arraycopy(parcelableArrayExtra, 0, workouts, 0, parcelableArrayExtra.length); sLinearLayout = findViewById(R.id.viewList); // Set the CardView layoutParams params = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT ); populateCardViews(); populateLayout(); } //TODO: this method will populate the linear layout, filling the list. private void populateLayout() { for (CardView cardView : cardViews) { sLinearLayout.addView(cardView); } } //TODO: this method will fill up the CardViews array with an array of workouts. private void populateCardViews() { cardViews = new CardView[workouts.length]; for(int i = 0; i < workouts.length; i++) { CardView card = new CardView(this); card.setClickable(true); card.setLayoutParams(params); // Set CardView corner radius card.setRadius(9); // Set cardView content padding card.setContentPadding(15, 15, 15, 15); // Set a background color for CardView card.setCardBackgroundColor(Color.BLUE); // Set the CardView maximum elevation card.setMaxCardElevation(50); // Set CardView elevation card.setCardElevation(25); // Initialize a new TextView to put in CardView TextView tv = new TextView(this); tv.setLayoutParams(params); tv.setText("Workout WorkTime: " + workouts[i].getWorkTime()); tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 30); tv.setTextColor(Color.WHITE); card.setTag(workouts[i].getWorkTime()); card.addView(tv); cardViews[i] = card; } }
p >
3 Réponses :
Je pense que vous pouvez setOnClickListener
pour chaque carte individuelle. L'index de la carte cliquée est i
for (int i = 0; i < workouts.length; i++) { ... final int finalI = i; card.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("TAG", "You click at card: " + finalI); } }); }
Je ne suis pas bon d'ajouter autant de mise en page par programmation. Vous pouvez utiliser une vue de l'outil de recyclage et un adaptateur pour afficher une liste d'articles. Vous pouvez lire ceci: https://developer.android.com/guide/topics / ui / layout / recyclerview
Au fait, dans votre cas: lorsque vous créez une Cardview, ajoutez-y simplement onClickListener
et l'index de votre Cardview en est l'index dans la liste Cardview.
CardView cardView = new CardView(this); cardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //handle click here } });
Vérifiez si cela fonctionne.
cardview.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int index = linearLayout.indexOfChild(v); } });