我有一个由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是否可用?
非常感谢您的帮助。
答案 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;
}