ScrollView - 从充气的xml布局添加动态行

时间:2014-06-11 13:05:16

标签: java android dynamic scrollview xml-layout

我目前有一个scrollview,我通过膨胀另一个xml布局来添加行。这一切都正常工作,并且所有行都正确显示。

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

我已经通过按钮显示了1 on on的示例代码,只需在选择此按钮时将其切换为在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++;

2 个答案:

答案 0 :(得分:1)

onClick OnClickListener方法的参数为vv的值将是被点击的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的结果?


修改

如果你真的需要View的那一行(并且它永远不会改变),这里有两个选择:

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

    并使用它而不是你的匿名类 或者只是在anonymus类之外添加一个最终变量:

    // currentRowIndex calculated by your program
    // i.e. 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
        }
    });
    

答案 1 :(得分:1)

将onClick()的View参数提供给EquipUnequip(),将其强制转换为ImageButton并使用它。否则你会得到最后创建的按钮。