繁体   English   中英

ScrollView-从膨胀的xml布局添加动态行

[英]ScrollView - Adding dynamic rows from inflated xml layout

我目前有一个scrollview,我通过膨胀另一个xml布局来添加行。 一切正常,行均正确显示。

我遇到的问题是我不确定如何检测选择了哪个按钮。

我已经展示了一些通过按钮1的示例代码,简单地说,当选择此按钮时,它将在2张图像之间切换。 但是,每当我按下按钮时,它总是自动切换底部的行按钮,而不是选择按钮所在的行。

有没有一种方法可以实现,同时仍将视图用作行(我不想动态创建行,因为这很混乱)?

ScrollView scrollWeapons = (ScrollView)findViewById(R.id.scrollWeapons);
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
int i = 0;

for(final Weapon w : Game.Weapons)
{
    View view = new View(this);
    LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = inflater.inflate(R.layout.menuweapons_row, null);

    btnSelected = (ImageButton)view.findViewById(R.id.btnSelected);
    btnSelected.setId(i);
    btnSelected.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            EquipUnequip(w.WeaponID());
        }
    });
}

private void EquipUnequip(int WeaponId)
{
    if(Game.Weapons.get(WeaponId).CharacterID() == ChrSelected)
    {
        btnSelected.setImageResource(R.drawable.eqip_but_idle);
    }
    else
    {
        btnSelected.setImageResource(R.drawable.eqip_but_press);
    }
}

ll.addView(view);
i++;

OnClickListeneronClick方法具有参数v v的值将是被单击的View ,即ImageButton 您现在要做的就是将View传递给EquipUnequip

...
btnSelected.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        EquipUnequip(w.WeaponID(), (ImageButton)v);
    }
});
...

private void EquipUnequip(int WeaponId, ImageButton btnSelected) {
    if(Game.Weapons.get(WeaponId).CharacterID() == ChrSelected) {
        btnSelected.setImageResource(R.drawable.eqip_but_idle);
    } else {
        btnSelected.setImageResource(R.drawable.eqip_but_press);
    }
}

PS:这部分对我来说似乎有点荒谬:

View view = new View(this);
LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.menuweapons_row, null);

为什么创建一个新的View只是不做任何事,然后将其替换为LayoutInflater的结果?


编辑

如果您确实需要视图的行(并且它永远不会改变),则有两种选择:

  1. OnClickListener保存行

     class MyOnClickListener implements OnClickListener { private final int rowIndex; MyOnClickListener(int rowIndex) { this.rowIndex = rowIndex; } @Override public void onClick(View v) { // do something with rowIndex } } 

    并使用它代替您的匿名类,或者只是在匿名类之外添加一个最终变量:

     // currentRowIndex calculated by your program // ie incremented in every iteration final int rowIndex = currentRowIndex; btnSelected.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // do something with rowIndex } }); 
  2. 将信息作为标记添加到按钮( currentRowIndex的类型为int ):

     btnSelected.setTag(currentRowIndex); // attach Integer data to the view btnSelected.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int rowIndex = (Integer)v.getTag(); // do something with rowIndex } }); 

将onClick()的View参数赋予EquipUnequip(),将其强制转换为ImageButton并使用它。 否则,您将获得最后创建的按钮。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM