在 LinearLayout 中获取视图的索引

Posted

技术标签:

【中文标题】在 LinearLayout 中获取视图的索引【英文标题】:Getting a view's index in a LinearLayout 【发布时间】:2020-10-15 09:34:00 【问题描述】:

所以我在我的 XML 文件中设置了一个 LinearLayout,并且我在我的活动启动时通过代码动态地添加了一堆 CardView。我怎样才能使当我点击任何 CardViews 时,我能够获得它的位置?

我尝试为 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;
    

【问题讨论】:

【参考方案1】:

我认为您可以为每张卡片 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);
        
    );

【讨论】:

【参考方案2】:

我不好以编程方式添加这么多布局。您可以使用回收站视图和适配器来显示项目列表。你可以阅读: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
    
);

【讨论】:

【参考方案3】:

看看这是否有效。

cardview.setOnClickListener(new OnClickListener() 

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

        
    );

【讨论】:

以上是关于在 LinearLayout 中获取视图的索引的主要内容,如果未能解决你的问题,请参考以下文章

在自定义视图中获取 LinearLayout 参考

一次获取 LinearLayout 中的所有子视图

使用jquery获取ul中当前正在点击的li的索引

JS获取列表索引值

从Android中的LinearLayout中删除视图时出现异常

从 LinearLayout (Android) 中删除所有视图