0
votes

Obtenir l'index d'une vue dans un LinearLayout

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 >


0 commentaires

3 Réponses :


0
votes

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


0 commentaires

0
votes

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


0 commentaires

0
votes

Vérifiez si cela fonctionne.

cardview.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
         int index = linearLayout.indexOfChild(v);

        }
    });


0 commentaires