将onCreate时间的侦听器分配给动态加载的ListView项的子视图

时间:2017-07-20 15:58:02

标签: android listview

我有一个由ArrayList / ArrayAdapter管理的ListView。 ListView项在XML布局文件中定义。

在初始化时(onCreate)我使用可变数量的项加载ListView,此时,我需要为每个项的一个子视图(SeekBar)分配一个监听器。

这是代码的相关部分:

private String TAG = "MainActivity";

private ListView lv_controlli;
private ArrayAdapter<String> adapter;
private LinkedHashMap<String, String> hmControlli;
private ArrayList<String> controlli;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Init();
}

private void Init() {

    lv_controlli = (ListView) findViewById(R.id.LV_Controls);

    hmControlli = new LinkedHashMap<String, String>();
    for (int i = 0; i < 6; i++) hmControlli.put(String.valueOf(i), "Gruppo " + i);
    controlli = new ArrayList<String>(hmControlli.keySet());
    adapter = new ArrayAdapter<String>(this, R.layout.control_layout, R.id.LBL_Controllo, controlli);
    lv_controlli.setAdapter(adapter);

    for (int i = 0; i < lv_controlli.getChildCount(); i++) {
        SeekBar sb = (SeekBar) lv_controlli.getChildAt(i).findViewById(R.id.SB_Intensita);
        sb.setOnSeekBarChangeListener(valueOnChange);
    }

}

private SeekBar.OnSeekBarChangeListener valueOnChange = new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        Log.i(TAG,String.valueOf(seekBar.getProgress()));
    }
    ...
};

public void click(View view) {

    for (int i = 0; i < lv_controlli.getChildCount(); i++) {
        SeekBar sb = (SeekBar) lv_controlli.getChildAt(i).findViewById(R.id.SB_Intensita);
        sb.setOnSeekBarChangeListener(valueOnChange);
    }

}

Init()例程没有分配任何侦听器(由onCreate()调用),因为它的执行发生在ListView尚未加载时,即使已经填充了适配器并将其分配给ListView。

相同类型的代码完美地工作,相反,在与控件返回给用户时按下的按钮关联的click()例程中。

所以我可以在我的互动之后让SeekBars真正可用,当然这很糟糕。

在将控件返回给用户之前,填充的ListView是否可用?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

解决此问题的正确方法很可能不是通过尝试查找onCreate()与应用控制权转移给用户之间的时间点,而是通过分配OnSeekBarChangeListener来解决此问题到适配器内的SeekBar

您可以创建使用ArrayAdapter的子类而不是基本ArrayAdapter实现,然后重写getView()以添加侦听器。类似的东西:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = super.getView(position, convertView, parent);
    SeekBar seekBar = (SeekBar) v.findViewById(R.id.SB_Intensita);
    seekBar.setOnSeekBarChangeListener(valueOnChange);
    return v;
}