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);
}
});