在线性布局中获取视图的索引



所以我在我的XML文件中设置了一个LinearLayout,并在启动活动时通过代码动态地向其添加一堆CardView。如何使我单击任何 CardView 时能够获得其位置?

我尝试为LinearLayout设置一个onClickListener,并为每张卡设置一个OnClickLIstener,但找不到获取所单击卡索引的方法。

我真的很想知道将onClickListener放在哪里,以及如何获取单击的位置,以便我可以根据单击的内容开始新活动。

这是我的代码:

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

我认为您可以为每张卡setOnClickListener。点击卡片的索引为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);
}
});
}

我不擅长以编程方式添加这么多布局。您可以使用回收器视图和适配器来显示项目列表。你可以阅读这个: https://developer.android.com/guide/topics/ui/layout/recyclerview

顺便说一下,在您的情况下:当您创建 Cardview 时,只需向其添加onClickListener,您的 Cardview 的索引就是它在 Cardview 列表中的索引。

CardView cardView = new CardView(this);
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//handle click here
}
});

看看这是否有效。

cardview.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int index = linearLayout.indexOfChild(v);
}
});

最新更新